home *** CD-ROM | disk | FTP | other *** search
/ Aminet 37 / Aminet 37 (2000)(Schatztruhe)[!][Jun 2000].iso / Aminet / game / patch / jst32b_dev.lha / jst_dev / sources / OSEmu / osemu.asm < prev    next >
Assembly Source File  |  2000-03-31  |  76KB  |  3,575 lines

  1. ;*---------------------------------------------------------------------------
  2. ;  :Program.    osemu.asm
  3. ;  :Author.    Harry, Wepl
  4. ;  :RCS.    $Id: osemu.asm 1.1 1999/02/03 04:10:48 jotd Exp jotd $
  5. ;  :History.    all work before history starts done by Harry
  6. ;    30.06.98   Wepl     rework started
  7. ;    06.07.98   Wepl     rework finished
  8. ;    07.07.98   Wepl     exec.Supervisor,exec.SuperState,exec.UserState
  9. ;                    exec.FindTask,exec.FindPort,exec.OpenDevice
  10. ;                    graphics.alot,exec.DoIO
  11. ;    15.07.98   Wepl     work for Deuteros finished
  12. ;    31.07.1998 Harry    SSP set on memtop again as it is in kick1.3
  13. ;                possibility of trainer routine added
  14. ;    10.08.98   Wepl     osemu header struct changed (SLAVETRAINER now
  15. ;                in osemu-struct instead overgiven via reg)
  16. ;    10.08.98   Wepl     gfx.BltBitMap fixed
  17. ;    ??.08.98   MrLarmer some additions
  18. ;    05.09.98   Wepl     AddIntServer/RemIntServer finally fixed
  19. ;                ReadPixel,WritePixel added
  20. ;    06.09.98   Wepl     return values after init changed (bootblock)
  21. ;                BltTemplate started (but unfinished)
  22. ;    22.09.98   Wepl     _SendIO is now the same as _DoIO (fix for Deuteros)
  23. ;    27.09.98   Harry    dos.lock (untested), device-names even-
  24. ;                aligned (68000-prob), (usp) initialized 
  25. ;                with stacksize (CC3 expects it in 4(usp) at
  26. ;                start), dummy: dos.input+dos.output+
  27. ;                exec.waitport
  28. ;    29.09.1998 Harry    list management functions implemented: 
  29. ;                exec.insert, exec.(add|rem)(head|tail), exec.remove
  30. ;    07.10.1998 Harry    list handling debugged, libs as list, one process
  31. ;                structure, exec.findtask changed, _initlibary
  32. ;                splittet, exec.getmsg, dos.deviceproc, intuition.
  33. ;                openwindow, intuition.closewindow, icon.library,
  34. ;                intuition.cleardmrequest, dos.unloadseg, 
  35. ;                minor fixes
  36. ;    11.10.1998 Harry    devices as list, dos.loadseg supports hunk_symbol,
  37. ;                audio.device-dummy, gfx.allocraster, gfx.freeraster,
  38. ;                gfx.bltclear, gfx.initbitmap (and #fe), intuition.
  39. ;                lockibase dummy, layers.library, mathffp.library,
  40. ;                trackdisk.device-msgport, execlib-table implemented
  41. ;                directly, exec.copymem, exec.findname, minor fixes
  42. ;    19.10.1998 Harry    dos.examine, dos.unlock, exec.setintvector,
  43. ;                audio-interrupts, gfx.getcolormap
  44. ;    20.10.1998 Harry    gfx.set(a|b)pen, gfx.setdrmd, gfx.initrastport,
  45. ;                topaz.font-replacement, gfx.openfont, gfx.setfont,
  46. ;                some gfx-structures
  47. ;    24.10.1998 Harry    gfx.text, some debugging, exec.allocsignal, 
  48. ;                gfx.move, problem with input.addhandler, 
  49. ;                exec.availmem keeps now a reserve of $1000, 
  50. ;                gfx.freecolormap
  51. ;    31.10.98   Wepl     input.device fixed, color handling changed 
  52. ;                (getcolormap,freecolormap,loadrgb4,initview,
  53. ;                initvport,makevport,loadview,setrgb4,getsprite,
  54. ;                freesprite,movesprite,changesprite,vbi
  55. ;    03.11.98   Wepl     bug in AllocMem fixed (size rounded up now)
  56. ;    25.11.1998 Harry    switched back to old gfx-viewport-stuff,
  57. ;                gfx.loadview(0)
  58. ;       30.11.1998 MrLarmer exec.(create|delete)(iorequest|msgport),
  59. ;                exec.freesignal, exec.allocsignal changed
  60. ;    01.12.1998 Harry    libs in osemu extended to V40 (as i dont have 
  61. ;                3.1-includes working with asm-one do not have 
  62. ;                the idea to replace the values by labels,
  63. ;                ill change them back!), exec.exitintr
  64. ;       05.12.1998 Harry    some debugging, list handling debugged again,
  65. ;                           exec.allocmem:MEMF_LARGEST dummy, MEMF_REVERSE
  66. ;                dummy, exec.setsignal, dos.currentdir, 
  67. ;                dos.waitforchar, execbase.vblankfrequency,
  68. ;                dos.duplock
  69. ;    09.01.1999 JOTD     bugfix in DoIO() return code (D0). "implemented"
  70. ;                           CMD_UPDATE (does nothing) and CMD_CLEAR
  71. ;    09.01.1999 JOTD     improved CloseWorkbench() intuition call
  72. ;                           Now returns 0 only once, and then 1
  73. ;                           Led Storm does not lock anymore now
  74. ;       10.01.1999 JOTD     added AlohaWorkbench() intuition call (dummy)
  75. ;                           added WaitBOFVP() (not accurate)
  76. ;                           added CloseScreen() (dummy)
  77. ;       14.01.1999 JOTD     added dos.library Info() function
  78. ;                           (for Flashback)
  79. ;       15.01.1999 JOTD     added D0=0 return codes in input.device
  80. ;       15.01.1999 JOTD     added lowlevel.library, nonvolatile.library
  81. ;                           added cd.device and freeanim.library (dummies)
  82. ;                           added exec CheckIO
  83. ;                           improved DoIO (dummy support of cd.device,cdtv.device)
  84. ;                           added WaitIO (dummy support of cd.device,cdtv.device)
  85. ;                           added SetFunction (for Banshee, now intro OK)
  86. ;       30.01.1999 JOTD     added keyboard.device (not complete)
  87. ;                           installed a default empty copperlist to avoid problems
  88. ;                           with JST
  89. ;       02.02.1999 JOTD     added complete lowlevel.library ReadJoyPort() function
  90. ;                           using function keys (F1-F5) for joypad extra buttons
  91. ;                           DoIO/SendIO: if device is not found, then return with
  92. ;                           no error (dummy for cd.device)
  93. ;                           Oscar CD32 now works perfectly!
  94. ;       18.03.1999 MrLarmer keyboard.device improved
  95. ;                       FreeSignal improved
  96. ;
  97. ;       30.03.1999 JOTD     Added graphics.library InitTmpRas, InitArea
  98. ;       01.04.1999 JOTD     Added mathffp.library SPFlt,SPDiv (removed
  99. ;                           from intuition.s)
  100. ;       01.04.1999 JOTD     Added mathtrans.library SPATan (untested)
  101. ;       17.04.1999 JOTD     Dummy console.device added
  102. ;       19.05.1999 JOTD     Added CMD_WRITE to trackdisk DoIO (for ArcadePool)
  103. ;                           Added dummy entry for nonvolatile StoreEnv
  104. ;                           Added items in the OSEmu structure for use with JST
  105. ;                           Added OSEmu ID, version/release and version string
  106. ;                           Added whdmacros.i include for v10 WHDLoad .i files
  107. ;       26.05.1999 JOTD     Added EntryType to FileInfoBlock structure
  108. ;                           (Sensible Soccer CD32 v1.2 needed 2 $FFFF in struct
  109. ;                           to get hold of the filesize, the bastards!)
  110. ;       08.06.1999 JOTD     Added fastmemory support, debug entry (HRTMon)
  111. ;                           Added flush cache after LoadSeg() succeeded (v1.4)
  112. ;       11.06.1999 JOTD     Corrected LoadSeg() to allocate hunks in chip/fast (v1.5)
  113. ;    26.06.1999 JOTD     Added dummy AssignPath()
  114. ;                           Added disk.resource OpenResource() (no functions yet)
  115. ;                           Fixed a bug in Examine if not found (FreeMem problem)
  116. ;                           Added ExamineFH (SlamTilt)
  117. ;                           Added AllocRemember/FreeRemember (SlamTilt)
  118. ;       10.08.1999 JOTD     Added dummy disk.resource GetUnit()
  119. ;                           Added AllocEntry/FreeEntry (on Bored Seal request) (v1.7)
  120. ;       24.09.1999 JOTD     Bugfixed DupLock() (v1.8)
  121. ;    12.02.2000 JOTD        Added dummy RemakeDisplay for Darkmere (v1.9)
  122. ;                           LoadSeg() bugfix: zero-length hunks are allowed
  123. ;       21.02.2000 Harry    Copperinterrupt implemented, Audioint and 
  124. ;                           Add/RemIcrVector fixed, minor changes (v1.10)
  125. ;                        Added HUNK_DEBUG support to LoadSeg()
  126. ;       02.03.2000 JOTD     Added dummy IoErr() (v1.11)
  127. ;
  128. ;    Note:    - does not run with JumpingJackSon because 
  129. ;          it expects an old bug in dos.LoadSeg (APTR instead BPTR)
  130. ;        - with Deuteros and Millenium2·2 the mouse poiner is invisible
  131. ;          now (broken graphics clist stuff)
  132. ;
  133. ;  :Copyright.    GPL
  134. ;  :Language.    68000 Assembler
  135. ;  :Translator.    Asm-One V1.30 R399, Barfly V2.9, Asm-Pro V1.12, Devpac V3.14
  136. ;---------------------------------------------------------------------------*
  137. ; Currently emulated functions:
  138. ;    exec.library
  139. ;        _LVOAddHead
  140. ;        _LVOAddIntServer    ;partial
  141. ;        _LVOAddPort        ;dummy !
  142. ;        _LVOAddTail
  143. ;        _LVOAllocAbs
  144. ;        _LVOAllocMem
  145. ;        _LVOAllocSignal
  146. ;        _LVOAvailMem
  147. ;        _LVOCloseDevice        ;dummy
  148. ;        _LVOCloseLibrary    ;dummy
  149. ;        _LVOCopyMem        ;not optimized
  150. ;        _LVODisable
  151. ;        _LVODoIO        ;some of trackdisk/input
  152. ;        _LVOEnable
  153. ;        _LVOExitIntr        ;experimentally
  154. ;        _LVOFindName
  155. ;        _LVOFindTask        ;partially
  156. ;        _LVOForbid        ;dummy
  157. ;        _LVOFreeMem
  158. ;        _LVOGetMsg        ;dummy
  159. ;        _LVOInsert
  160. ;        _LVOOldOpenLibrary
  161. ;        _LVOOpenDevice        ;only trackdisk/input !
  162. ;        _LVOOpenLibrary
  163. ;        _LVOOpenResource
  164. ;        _LVOPermit        ;dummy
  165. ;        _LVORemove
  166. ;        _LVORemHead
  167. ;        _LVORemIntServer
  168. ;        _LVORemPort        ;dummy
  169. ;        _LVORemTail
  170. ;        _LVOSendIO        ;only input !
  171. ;        _LVOSetIntVector    ;only audiointerrupts
  172. ;        _LVOSetSignal
  173. ;        _LVOSuperState        ;exact v39
  174. ;        _LVOSupervisor
  175. ;        _LVOUserState        ;exact v39
  176. ;    dos.library
  177. ;        _LVOClose
  178. ;        _LVOCurrentDir        ;returns always 0 for rootdir
  179. ;        _LVODeviceProc        ;dummy
  180. ;        _LVODupLock        ;limited to files and null for rootdir
  181. ;        _LVOExamine        ;doesnt work for dirs atm, only files and volumes
  182. ;        _LVOInput        ;dummy
  183. ;        _LVOLoadSeg
  184. ;        _LVOLock        ;atm no dirs, only files and volumes
  185. ;        _LVOOpen
  186. ;        _LVOOutput        ;dummy
  187. ;        _LVORead
  188. ;        _LVOSeek
  189. ;        _LVOUnLoadSeg
  190. ;        _LVOUnLock        ;internal the same as dos.close
  191. ;        _LVOWaitForChar        ;atm dummy, implementation freezed
  192. ;        _LVOWrite
  193. ;    graphics.library
  194. ;        _LVOAllocRaster
  195. ;        _LVOBltBitMap        ;has still some limitations !
  196. ;        _LVOBltClear        ;with CPU
  197. ;        _LVOBltTemplate        ;broken
  198. ;        _LVODisownBlitter    ;dummy
  199. ;        _LVOChangeSprite
  200. ;        _LVODraw        ;dummy !
  201. ;        _LVOFreeColorMap
  202. ;        _LVOFreeRaster
  203. ;        _LVOFreeSprite
  204. ;        _LVOGetColorMap
  205. ;        _LVOGetSprite
  206. ;        _LVOInitBitMap
  207. ;        _LVOInitRastPort
  208. ;        _LVOInitView        ;dummy !
  209. ;        _LVOInitVPort        ;dummy !
  210. ;        _LVOLoadView        ;sets copperlist
  211. ;        _LVOLoadRGB4        ;sets colors immediate
  212. ;        _LVOMakeVPort        ;builds copperlist
  213. ;        _LVOMove
  214. ;        _LVOMoveSprite
  215. ;        _LVOMrgCop
  216. ;        _LVOOwnBlitter        ;dummy
  217. ;        _LVOReadPixel
  218. ;        _LVOSetAPen
  219. ;        _LVOSetBPen
  220. ;        _LVOSetDrMd
  221. ;        _LVOSetRGB4        ;sets color immediate
  222. ;        _LVOText
  223. ;        _LVOVBeamPos
  224. ;        _LVOWaitBlit
  225. ;        _LVOWaitTOF
  226. ;        _LVOWritePixel
  227. ;    intuition.library
  228. ;        _LVOClearDMRequest    ;dummy
  229. ;        _LVOCloseWindow        ;rudimentary
  230. ;        _LVOCloseWorkbench
  231. ;        _LVOOpenWindow        ;rudimentary
  232. ;    ciaa.resource,ciab.resource
  233. ;        _LVOAddICRVector
  234. ;        _LVORemICRVector
  235. ;    icon.library
  236. ;    layers.library
  237. ;    mathffp.library
  238. ;    mathtrans.library
  239. ;---------------------------------------------------------------------------*
  240. ; programs using this stuff (non exhaustive list):
  241. ;    AnotherWorld (WHDLoad), Arcade Pool (JST), Blue Angel 69 (WHDLoad), 
  242. ;       Bombuzal (WHDLoad), Bubble Bobble (JST), Castle Master (WHDLoad), 
  243. ;       Colorado, Crazy Cars 3 (WHDLoad), Deuteros (WHDLoad), Flashback (JST), 
  244. ;       Flink CD32 (WHDLoad), JumpingJackSon (WHDLoad), Lionheart (WHDLoad),
  245. ;       Metal Mutant, North&South (WHDLoad), Oscar CD32 (JST), 
  246. ;       PushOver (WHDLoad), Sensible Soccer CD32 (JST), 
  247. ;       Shadow Fighter CD32 (JST), Son Of Stag series (JST), 
  248. ;       Street Fighter 1 (JST), Bubba and Stix (JST), Sierra Soccer (JST)...
  249. ;
  250. ; unfinished:
  251. ;    Millenium 2·2, Lords of War (works until title), 
  252. ;    Prehistorik (gfx.MrgCop must be improved),
  253. ;       Black Tiger (JST) (works until title), Led Storm (JST) (no gfx in game),
  254. ;    Imperium (JST)
  255. ;---------------------------------------------------------------------------*
  256. ; ToDo:
  257. ;    rewriting memory management for less memory waste
  258. ;    implement dos.waitforchar fully: allow open to raw:, read characters,
  259. ;      close
  260. ;    support nonexisting files in dos.lib
  261. ;
  262. ;---------------------------------------------------------------------------*
  263. ; How to use in WHDLoad:
  264. ;
  265. ;    ;load the osemu module
  266. ;        lea    (_osemu,pc),a0        ;filename of the osemu module
  267. ;        lea    ($400.w),a1        ;the address on which you have
  268. ;                        ;assembled the osemu module
  269. ;        move.l    (_resload,pc),a2    ;the resload base
  270. ;        jsr    (resload_LoadFileDecrunch,a2)    ;this allows to
  271. ;                        ;compress the osemu
  272. ;    ;init the osemu module
  273. ;                        ;system stack has to be on 
  274. ;                        ;top of memory (automatically
  275. ;                        ;done by whdload)
  276. ;        move.l    (_resload,pc),a0    ;the resload base
  277. ;        lea    (_base,pc),a1        ;the slave structure
  278. ;        jsr    $400
  279. ;
  280. ;    ;start the program
  281. ;        move    #0,sr            ;if the program uses the os it
  282. ;                        ;should executed in user mode
  283. ;
  284. ;    ;if you want to add a trainer use this, to setup a routine which will
  285. ;    ;be called each time a key is pressed (d0.b contains rawkeycode)
  286. ;        lea    (_trainer,pc),a0
  287. ;        move.l    a0,($404.w)
  288. ;    ;if you want to use fast memory:
  289. ;        lea    (_base,pc),a1        ;the slave structure
  290. ;        move.l    (ws_ExpMem,A1),($424.w)
  291. ;        move.l    #<expmem size>,($428.w)
  292. ;
  293. ;---------------------------------------------------------------------------*
  294.  
  295. ;---------------------------------------------------------------------------*
  296. ; How to use in JST:
  297. ;
  298. ;    ;allocate expansion memory if needed
  299. ;
  300. ;    move.l    #$100000,D0    ; 1meg
  301. ;    JSRABS    AllocExtMem
  302. ;
  303. ;    ;load the osemu module (when the OS is active)
  304. ;
  305. ;    JSRABS    UseHarryOSEmu
  306. ;
  307. ;    ;start the program
  308. ;
  309. ;    GO_SUPERVISOR
  310. ;    SAVE_OSDATA    xxxx            ; classical OS-kill call
  311. ;
  312. ;    move    #0,sr            ;if the program uses the os it
  313. ;                    ;should executed in user mode
  314. ;                    ;but it's seldom necessary
  315. ;
  316. ;    ;if you want to add a trainer use this, to setup a routine which will
  317. ;    ;be called each time a key is pressed (d0.b contains rawkeycode)
  318. ;        lea    (_trainer,pc),a0
  319. ;        move.l    a0,$400+OSM_SLVTRAINER
  320. ;
  321. ;---------------------------------------------------------------------------*
  322.  
  323.     INCLUDE    whoami.i            ;this contains only a symbol
  324.  
  325.     IFD HARRY                ;(asm-one)
  326.         INCDIR    ASM-ONE:INCLUDE2.0/
  327.         INCLUDE LIBRARIES/DOS_LIB.I
  328.         INCLUDE    LIBRARIES/DOS.I
  329.         INCLUDE    DEVICES/INPUT.I
  330.         INCLUDE    DEVICES/KEYBOARD.I
  331.         INCLUDE    DEVICES/TRACKDISK.I
  332.         INCLUDE    DOS/DOSEXTENS.I
  333.         INCLUDE    DOS/DOSHUNKS.i
  334.         INCLUDE RESOURCES/CIA_LIB.I
  335.         INCLUDE EXEC/EXEC_LIB.I
  336.         INCLUDE    EXEC/MEMORY.I
  337.         INCLUDE    EXEC/TASKS.I
  338.         INCLUDE    GRAPHICS/GRAPHICS_LIB.I
  339.         INCLUDE    GRAPHICS/LAYERS_LIB.I
  340.         INCLUDE    GRAPHICS/GFXBASE.I
  341.         INCLUDE    GRAPHICS/DISPLAYINFO.I
  342.         INCLUDE    GRAPHICS/SPRITE.I
  343.         INCLUDE    HARDWARE/CUSTOM.I
  344.         INCLUDE INTUITION/INTUITION_LIB.I
  345.         INCLUDE INTUITION/INTUITION.I
  346.         INCLUDE    MATH/MATHFFP_LIB.I
  347.         INCLUDE    MATH/MATHTRANS_LIB.I
  348.         INCLUDE    OWN/CCRMAKRO
  349.         INCLUDE    OWN/WHDLOAD.I
  350.         INCLUDE    WORKBENCH/ICON_LIB.I
  351.         INCLUDE    OWN/WHDMACROS.I
  352.         INCLUDE    OWN/LOWLEVEL_LIB.I
  353.         INCLUDE    OWN/LOWLEVEL.I
  354.         INCLUDE    OWN/NONVOLATILE_LIB.I
  355.         INCLUDE RESOURCES/DISK_LIB.I
  356. HUNKB_CHIP    =    30
  357. HUNKB_FAST    =    31
  358.     org    $400
  359.     load    $100000
  360.     ENDC
  361.     IFD WEPL                ;(barfly)
  362.         INCDIR    Includes:
  363.         INCLUDE    devices/input.i
  364.         INCLUDE    devices/inputevent.i
  365.         INCLUDE    devices/trackdisk.i
  366.         INCLUDE    devices/keyboard.I
  367.         INCLUDE    dos/dos.i
  368.         INCLUDE    dos/doshunks.i
  369.         INCLUDE    dos/dosextens.i
  370.         INCLUDE    exec/memory.i
  371.         INCLUDE    exec/tasks.i
  372.         INCLUDE    graphics/gfx.i
  373.         INCLUDE    graphics/gfxbase.i
  374.         INCLUDE    graphics/rastport.i
  375.         INCLUDE    graphics/sprite.i
  376.         INCLUDE    graphics/view.i
  377.         INCLUDE    intuition/intuition.i
  378.         INCLUDE    lvo/cia.i
  379.         INCLUDE    lvo/dos.i
  380.         INCLUDE    lvo/exec.i
  381.         INCLUDE    lvo/graphics.i
  382.         INCLUDE    lvo/icon.i
  383.         INCLUDE    lvo/intuition.i
  384.         INCLUDE    lvo/layers.i
  385.         INCLUDE    lvo/mathffp.i
  386.         INCLUDE    lvo/mathtrans.i
  387.         INCLUDE    whdload.i
  388.         INCLUDE    whdmacros.i    ; added for WHDLoad v10 includes
  389.  
  390.         IFD BARFLY
  391.         BOPT    O+ OG+            ;enable optimizing
  392.         BOPT    ODd- ODe-        ;disable mul optimizing
  393.         BOPT    w4-            ;disable 64k warnings
  394.         SUPER                ;disable supervisor warnings
  395.         ENDC
  396.  
  397.         ORG    $400
  398.         OUTPUT    OSEmu.400
  399.         ;OUTPUT    wart:a/anotherworld/osemumodule400.bin
  400.         ;OUTPUT    wart:b/bombuzal/osemumodule400.bin
  401.         ;OUTPUT    wart:d-f/deuteros/OSEmu.400
  402.         ;OUTPUT    wart:h-j/jumpingjackson/osemumodule400.bin
  403.         ;OUTPUT    wart:m/millennium2·2/OSEmu.400
  404.         ;OUTPUT    wart:n-p/north&south/OSEmu.400
  405.     ENDC
  406.  
  407.     IFD JOTD                ;(phxass/barfly)
  408.         INCDIR    include:
  409.         INCLUDE    "LVOs.i"
  410.         INCLUDE    "jst_libs.i"
  411.         INCLUDE    "dos/doshunks.i"
  412.         INCLUDE "devices/trackdisk.i"
  413.         INCLUDE "devices/input.i"
  414.         INCLUDE    "devices/keyboard.I"
  415.         INCLUDE "devices/inputevent.i"
  416.         INCLUDE "exec/interrupts.i"
  417.         INCLUDE    "graphics/gfx.i"
  418.         INCLUDE    "graphics/gfxbase.i"
  419.         INCLUDE    "graphics/rastport.i"
  420.         INCLUDE    "graphics/sprite.i"
  421.         INCLUDE    "graphics/view.i"
  422.         INCLUDE    "intuition/intuition.i"
  423.         INCLUDE    "libraries/lowlevel.i"
  424.         INCLUDE    "libraries/nonvolatile.i"
  425.  
  426.         INCLUDE    "whdload.i"
  427.         INCLUDE    "whdmacros.i"    ; added for WHDLoad v10 includes
  428.  
  429.         IFD BARFLY
  430.         BOPT    O+ OG+            ;enable optimizing
  431.         BOPT    ODd- ODe-        ;disable mul optimizing
  432.         BOPT    w4-            ;disable 64k warnings
  433.         BOPT    wo-            ;disable optimizer warnings
  434.         SUPER                ;disable supervisor warnings
  435.         ENDC
  436.  
  437.         ORG    $400
  438.         OUTPUT    C:OSEmu.400
  439.  
  440.     ENDC
  441.  
  442.     IFD MR.LARMER                ;(devpac)
  443.         INCDIR    Include:
  444.         INCLUDE    devices/input.i
  445.         INCLUDE    devices/inputevent.i
  446.         INCLUDE    devices/keyboard.i
  447.         INCLUDE    devices/trackdisk.i
  448.         INCLUDE    dos/dos.i
  449.         INCLUDE    dos/doshunks.i
  450.         INCLUDE    dos/dosextens.i
  451.         INCLUDE    exec/memory.i
  452.         INCLUDE    graphics/gfx.i
  453.         INCLUDE    graphics/gfxbase.i
  454.         INCLUDE    graphics/rastport.i
  455.         INCLUDE    graphics/sprite.i
  456.         INCLUDE    graphics/view.i
  457.         INCLUDE    intuition/intuition.i
  458.         INCLUDE    libraries/lowlevel.i
  459.         INCLUDE    libraries/nonvolatile.i
  460.         INCLUDE    lvo/cia_lib.i
  461.         INCLUDE    lvo/dos_lib.i
  462.         INCLUDE    lvo/exec_lib.i
  463.         INCLUDE    lvo/graphics_lib.i
  464.         INCLUDE    lvo/icon_lib.i
  465.         INCLUDE    lvo/intuition_lib.i
  466.         INCLUDE    lvo/layers_lib.i
  467.         INCLUDE    lvo/lowlevel_lib.i
  468.         INCLUDE    lvo/mathffp_lib.i
  469.         INCLUDE    lvo/mathtrans_lib.i
  470. ;        INCLUDE    lvo/nonvolatile_lib.i
  471.         INCLUDE    whdload.i
  472.  
  473.         OPT    O+ OG+            ;enable optimizing
  474.         OPT    P=68020
  475.  
  476.         ORG    $400
  477.         OUTPUT    OSEmu.400
  478.     ENDC
  479.  
  480. USPLENGTH=$2000        ;reserved area for USP, enlarge if necessary
  481.  
  482. CORRECTDEVICES=1    ;if set 0, module will be assembled with
  483.             ;cut-down devices (no list connection, no
  484.             ;msgport of td.dev, no library-like device-
  485.             ;structure)
  486.  
  487. ; config bits for JST
  488. ; (WHDLoad has got its tags, why JST cannot have its ones :))
  489.  
  490. AFB_NTSC = 0
  491. AFB_NOOSSWAP = 4
  492.  
  493. ;---------------------------------------------------------------------------*
  494. **************************************************************************
  495. *   INITIALIZATION CALL                                                  *
  496. **************************************************************************
  497.  
  498.         bra    _Init
  499.         CNOP 0,4    ;essential for correct OSEmu-Structure !
  500.  
  501. **************************************************************************
  502. *   GLOBAL VARIABLES                                                     *
  503. **************************************************************************
  504.  
  505. ;-------------------------------------------------------------------------
  506. ; the following data are part of the OSEmu structure, the offsets of these
  507. ; data are guaranteed to remain unchanged for all future versions
  508.  
  509. VERSION = 1
  510. RELEASE = 11
  511.  
  512. OSM_SLVTRAINER    DC.L    0    ;OSEmu-Offset = 4
  513. OSM_LASTLOADSEG    dc.l    0    ;OSEmu-Offset = 8
  514. OSM_ID        dc.b    "OSEM"    ;OSEmu-Offset = 12 : added by JOTD
  515. OSM_VER        dc.w    VERSION    ;OSEmu-Offset = 16 : ""
  516.         dc.w    RELEASE    ;OSEmu-Offset = 18 : ""
  517. OSM_COPPERADDR    dc.l    0    ;OSEmu-Offset = 20 : "" 
  518. OSM_ICONIFYCODE    dc.l    0    ;OSEmu-Offset = 24 : ""
  519. OSM_ICONIFYKEY    dc.l    0    ;OSEmu-Offset = 28 : ""
  520. OSM_JSTFLAGS    dc.l    0    ;OSEmu-Offset = 32 : ""
  521. OSM_EXPMEM    dc.l    0    ;OSEmu-Offset = 36 : ""
  522. OSM_EXPSIZE    dc.l    0    ;OSEmu-Offset = 40 : ""
  523. OSM_DEBUGENTRY    dc.l    0    ;OSEmu-Offset = 44 : ""
  524.         dc.l    0,0,0,0,0,0,0,0    ; future use
  525. ; version string
  526.  
  527.     dc.b    "$VER: OSEmu v",VERSION+'0',".",RELEASE+'0',0
  528.     cnop    0,4
  529.  
  530. ;-------------------------------------------------------------------------
  531.  
  532. ALLOCMTABSIZE    DC.L    0        ; chip memory
  533. ALLOCFASTMTABSIZE    DC.L    0    ; fast memory
  534. _Slave        dc.l    0
  535. _RESLOAD    dc.l    0
  536. _dosbase    dc.l    0
  537. _gfxbase    dc.l    0
  538. _intbase    dc.l    0
  539. _ilibbase    dc.l    0
  540. _laybase    dc.l    0
  541. _mffpbase    dc.l    0
  542. _mtrbase    dc.l    0    ; added by JOTD
  543. _lowlbase    dc.l    0    ; added by JOTD
  544. _franbase    dc.l    0    ; added by JOTD
  545. _nonvbase    dc.l    0    ; added by JOTD
  546. _diskbase    dc.l    0    ; added by JOTD
  547. _ciaabase    dc.l    0
  548. _ciabbase    dc.l    0
  549. _inputhandler    dc.l    0            ;input.device handler (interrupt server structure)
  550. _inputevent    ds.b    ie_SIZEOF
  551. _tags        dc.l    WHDLTAG_ATTNFLAGS_GET
  552.         dc.w    0
  553. _attnflags    dc.w    0
  554.         dc.l    WHDLTAG_ECLOCKFREQ_GET
  555. _eclockfreq    dc.l    0
  556.         dc.l    WHDLTAG_MONITOR_GET
  557. _monitor    dc.l    0
  558.         dc.l    WHDLTAG_CHIPREVBITS_GET
  559. _chiprev    dc.l    0
  560.         dc.l    WHDLTAG_Private3
  561. _p3        dc.l    0
  562.         dc.l    0
  563.  
  564. _libtable    dc.l    _dosname,DOSINIT
  565.         dc.l    _gfxname,GFXINIT
  566.         dc.l    _intname,INTUIINIT
  567.         dc.l    _execname,EXEC2INIT
  568.         dc.l    _ilibname,ILIBINIT
  569.         dc.l    _layname,LAYERSINIT
  570.         dc.l    _mffpname,MATHFFPINIT
  571.         dc.l    _lowlname,LOWLINIT
  572.         dc.l    _franname,FRANINIT
  573.         dc.l    _mtrname,MATHTRANSINIT
  574.         dc.l    _nonvname,NONVINIT
  575.         dc.l    0
  576. _restable    dc.l    _ciaaname,CIAAINIT
  577.         dc.l    _ciabname,CIABINIT
  578.         dc.l    _diskname,DISKINIT
  579.         dc.l    0
  580.  
  581. _devtable
  582. _tddevtable    DC.L    _tdname,0
  583. _inpdevtable    DC.L    _inpname,0
  584. _auddevtable    DC.L    _audname,0
  585. _cddevtable    DC.L    _cdname,0
  586. _cdtvdevtable    DC.L    _cdtvname,0
  587. _kbdevtable    DC.L    _kbdevname,0
  588. _condevtable    DC.L    _condevname,0
  589.         DC.L    0
  590.  
  591. ; added by JOTD
  592. sec_timer:
  593.     dc.l    0
  594. millisec_timer:
  595.     dc.l    0
  596.  
  597. _last_joy0dat    dc.w    0
  598.  
  599. _sprites    ds.l    8
  600.  
  601. KBDVAL        DC.B    0
  602. _last_lmb    dc.b    0
  603. _last_rmb    dc.b    0
  604.  
  605. _mffpname    dc.b    'mathffp.library',0
  606. _layname    dc.b    'layers.library',0
  607. _ilibname    dc.b    'icon.library',0
  608. _execname    dc.b    "exec.library",0
  609. _dosname    dc.b    "dos.library",0
  610. _gfxname    dc.b    "graphics.library",0
  611. _intname    dc.b    "intuition.library",0
  612. _lowlname    dc.b    "lowlevel.library",0    ; added by JOTD
  613. _franname    dc.b    "freeanim.library",0    ; added by JOTD
  614. _nonvname    dc.b    "nonvolatile.library",0    ; added by JOTD
  615. _mtrname    dc.b    "mathtrans.library",0    ; added by JOTD
  616. _ciaaname    dc.b    "ciaa.resource",0
  617. _ciabname    dc.b    "ciab.resource",0
  618. _diskname    dc.b    "disk.resource",0
  619.     EVEN
  620. _tdname        dc.b    'trackdisk.device',0
  621.     EVEN
  622. _inpname    dc.b    'input.device',0
  623.     EVEN
  624. _audname    dc.b    'audio.device',0
  625.     EVEN
  626. _cdname        dc.b    'cd.device',0
  627.     EVEN
  628. _cdtvname    dc.b    'cdtv.device',0
  629.     EVEN
  630. _kbdevname    dc.b    'keyboard.device',0
  631.     EVEN
  632. _condevname    dc.b    'console.device',0
  633.     EVEN
  634.  
  635. ;task gets a process structure
  636.  
  637. _EXECLIBTASK    DC.L    0
  638.         DC.L    0
  639.         DC.B    NT_TASK
  640.         DC.B    0
  641.         DC.L    _execname
  642.         DC.B    0
  643.         DC.B    TS_RUN
  644.         DC.B    0
  645.         DC.B    0
  646.         DC.L    0        ;TC_SIGALLOC
  647.         DC.L    0
  648.         DC.L    0
  649.         DC.L    0
  650.         DC.W    0
  651.         DC.W    0
  652.         DC.L    0
  653.         DC.L    0
  654.         DC.L    0
  655.         DC.L    0
  656.         DC.L    0
  657.         DC.L    0
  658.         DC.L    0
  659.         DC.L    0
  660.         DC.L    0
  661.  
  662.         DC.L    0
  663.         DC.L    0
  664.         DC.L    0
  665.         DC.B    0
  666.         DC.B    0
  667.  
  668.         DC.L    0
  669.  
  670. _EXECLIBMSGPORT    DC.L    0        ;MUST FOLLOW DIRECTLY TO TASK
  671.         DC.L    0        ;CC3 EXPECTS THAT SO
  672.         DC.B    NT_MSGPORT
  673.         DC.B    0
  674.         DC.L    0
  675.  
  676.         DC.B    PA_SIGNAL
  677.         DC.B    0        ;BIT 0 AS SIGNALBIT
  678.         DC.L    _EXECLIBTASK
  679.  
  680.         DC.L    0        ;NO MESSAGES YET
  681.         DC.L    0
  682.         DC.L    0
  683.         DC.B    NT_MESSAGE
  684.         DC.B    0
  685.  
  686.  
  687.         DC.W    0
  688.         DC.L    $EEEEEEEE    ;INVALID SEGLIST
  689.         DC.L    USPLENGTH-$20
  690.         DC.L    $EEEEEEEC    ;INVALID GLOBVEC
  691.         DC.L    1
  692.         DC.L    0
  693.         DC.L    0
  694.         DC.L    $EEEEEEEA
  695.         DC.L    0
  696.         DC.L    0
  697.         DC.L    $EEEEEEEE
  698.         DC.L    $EEEEEEEE
  699. _bcplcorrect1    DC.L    _CLI
  700.         DC.L    $EEEEEEEE
  701.         DC.L    0
  702.         DC.L    -1
  703. _EXECLIBPROCESS_SIZEOF
  704.  
  705.     IFNE    _EXECLIBMSGPORT-_EXECLIBTASK-$5C
  706.     FAIL
  707.     ENDC
  708.  
  709.     IFNE    _EXECLIBPROCESS_SIZEOF-_EXECLIBTASK-$BC
  710.     FAIL
  711.     ENDC
  712.  
  713.  
  714.     CNOP    0,4
  715. _CLI        DC.L    0
  716.         DC.L    $EEEEEEE
  717.         DC.L    $EEEEEEE
  718.         DC.L    0
  719. _bcplcorrect2    DC.L    _ANIMNAME
  720.         DC.L    20
  721.         DC.L    $EEEEEEE
  722.         DC.L    $EEEEEEE
  723.         DC.L    $EEEEEEE
  724.         DC.L    $EEEEEEE
  725.         DC.L    0
  726.         DC.L    0
  727.         DC.L    $EEEEEEE
  728.         DC.L    USPLENGTH-$20
  729.         DC.L    $EEEEEEE
  730.         DC.L    $EEEEEEE
  731.  
  732.     CNOP    0,4
  733. _ANIMNAME    DC.B    8,'df0:anim',0
  734.  
  735.     EVEN
  736.  
  737. _EXECMINSIZE
  738.  
  739.     DS.B    822        ;-_LVOExecReserved08
  740.  
  741. _EXECLIBBASE
  742.     DC.L    _LIBLIST+4
  743.     DC.L    _LIBLIST
  744.     DC.B    NT_LIBRARY
  745.     DC.B    0
  746.     DC.L    _execname
  747.                     ;end of node structure
  748.     DC.B    4
  749.     DC.B    $EE
  750.     DC.W    -_LVOCopyMemQuick
  751.     DC.W    $24C
  752.     DC.W    $28            ;version of exec.lib=KS3.1
  753.     DC.W    $0A            ;subversion
  754.     DC.L    $EEEEEEEE
  755.     DC.L    $EEEEEEEE
  756.     DC.W    0
  757.                     ;end of library structure
  758.     DC.W    $44            ;version: KS3.1
  759.     DC.W    $EEEE
  760.     DC.L    $EEEEEEEE
  761.     DC.L    $EEEEEEEE
  762.     DC.L    $EEEEEEEE
  763.     DC.L    $EEEEEEEE
  764.     DC.L    0
  765.     DC.L    0
  766.     DC.L    0
  767.     DC.L    0
  768.     DC.L    0
  769.     DC.L    $EEEEEEEE
  770.     DC.L    0
  771.     DC.W    $EEEE    
  772.  
  773.     DC.L    $DDDDDDDD
  774.     DC.L    $DDDDDDDD
  775.     DC.L    $DDDDDDDD
  776.  
  777.     DC.L    $DDDDDDDD
  778.     DC.L    $DDDDDDDD
  779.     DC.L    $DDDDDDDD
  780.  
  781.     DC.L    $DDDDDDDD
  782.     DC.L    $DDDDDDDD
  783.     DC.L    $DDDDDDDD
  784.  
  785.     DC.L    $DDDDDDDD
  786.     DC.L    $DDDDDDDD
  787.     DC.L    $DDDDDDDD
  788.  
  789.     DC.L    $DDDDDDDD
  790.     DC.L    $DDDDDDDD
  791.     DC.L    $DDDDDDDD
  792.  
  793.     DC.L    $DDDDDDDD
  794.     DC.L    $DDDDDDDD
  795.     DC.L    $DDDDDDDD
  796.  
  797.     DC.L    $DDDDDDDD
  798.     DC.L    $DDDDDDDD
  799.     DC.L    $DDDDDDDD
  800.  
  801.     DC.L    $DDDDDDDD
  802.     DC.L    $DDDDDDDD
  803.     DC.L    $DDDDDDDD
  804.  
  805.     DC.L    $DDDDDDDD
  806.     DC.L    $DDDDDDDD
  807.     DC.L    $DDDDDDDD
  808.  
  809.     DC.L    $DDDDDDDD
  810.     DC.L    $DDDDDDDD
  811.     DC.L    $DDDDDDDD
  812.  
  813.     DC.L    $DDDDDDDD
  814.     DC.L    $DDDDDDDD
  815.     DC.L    $DDDDDDDD
  816.  
  817.     DC.L    $DDDDDDDD
  818.     DC.L    $DDDDDDDD
  819.     DC.L    $DDDDDDDD
  820.  
  821.     DC.L    $DDDDDDDD
  822.     DC.L    $DDDDDDDD
  823.     DC.L    $DDDDDDDD
  824.  
  825.     DC.L    $DDDDDDDD
  826.     DC.L    $DDDDDDDD
  827.     DC.L    $DDDDDDDD
  828.  
  829.     DC.L    $DDDDDDDD
  830.     DC.L    $DDDDDDDD
  831.     DC.L    $DDDDDDDD
  832.  
  833.     DC.L    $DDDDDDDD
  834.     DC.L    $DDDDDDDD
  835.     DC.L    $DDDDDDDD
  836.  
  837.     DC.L    _EXECLIBTASK
  838.     DC.L    $EEEEEEEE
  839.     DC.L    $EEEEEEEE
  840.     DC.W    $EEEE
  841.     DC.W    $DDDD
  842.     DC.W    $EEEE
  843.     DC.B    -1
  844.     DC.B    -1
  845.     DC.W    0
  846.     DC.W    $EEEE
  847.     DC.L    $EEEEEEEE
  848.     DC.L    $EEEEEEEE
  849.     DC.L    $EEEEEEEE
  850.     DC.L    $EEEEEEEE
  851.     DC.L    $EEEEEEEE        ;DUMMY, NORMALLY ALLOCATED SIGNALS
  852.     DC.W    $EEEE
  853.  
  854.     DC.L    $EEEEEEEE
  855.     DC.L    $EEEEEEEE
  856.     DC.L    $EEEEEEEE
  857.     DC.W    $EEEE
  858.  
  859.     DC.L    $EEEEEEEE
  860.     DC.L    $EEEEEEEE
  861.     DC.L    $EEEEEEEE
  862.     DC.W    $EEEE
  863.  
  864.     IFNE    CORRECTDEVICES
  865. _DEVLISTC    DC.L    _DEVLISTC+4
  866.         DC.L    0
  867.         DC.L    _DEVLISTC
  868.         DC.B    NT_DEVICE
  869.         DC.B    0
  870.     ELSE
  871.         DC.L    $EEEEEEEE        ;DEVICELIST
  872.         DC.L    $EEEEEEEE
  873.         DC.L    $EEEEEEEE
  874.         DC.W    $EEEE
  875.     ENDC
  876.  
  877.     DC.L    $EEEEEEEE
  878.     DC.L    $EEEEEEEE
  879.     DC.L    $EEEEEEEE
  880.     DC.W    $EEEE
  881.  
  882. _LIBLIST    DC.L    _EXECLIBBASE
  883.         DC.L    0
  884.         DC.L    _EXECLIBBASE
  885.         DC.B    NT_LIBRARY
  886.         DC.B    0
  887.  
  888.     DC.L    $EEEEEEEE
  889.     DC.L    $EEEEEEEE
  890.     DC.L    $EEEEEEEE
  891.     DC.W    $EEEE
  892.  
  893. _TASKREADYLIST    DC.L    _TASKREADYLIST+4
  894.         DC.L    0
  895.         DC.L    _TASKREADYLIST
  896.         DC.B    NT_TASK
  897.         DC.B    0
  898.  
  899.     DC.L    $EEEEEEEE
  900.     DC.L    $EEEEEEEE
  901.     DC.L    $EEEEEEEE
  902.     DC.W    $EEEE
  903.  
  904.     DC.L    $EEEEEEEE
  905.     DC.L    $EEEEEEEE
  906.     DC.L    $EEEEEEEE
  907.     DC.L    $EEEEEEEE
  908.  
  909.     DC.L    $EEEEEEEE
  910.     DC.L    $EEEEEEEE
  911.     DC.L    $EEEEEEEE
  912.     DC.L    $EEEEEEEE
  913.  
  914.     DC.L    $EEEEEEEE
  915.     DC.L    $EEEEEEEE
  916.     DC.L    $EEEEEEEE
  917.     DC.L    $EEEEEEEE
  918.  
  919.     DC.L    $EEEEEEEE
  920.     DC.L    $EEEEEEEE
  921.     DC.L    $EEEEEEEE
  922.     DC.L    $EEEEEEEE
  923.  
  924.     DC.L    $EEEEEEEE
  925.     DC.L    $EEEEEEEE
  926.     DC.L    $EEEEEEEE
  927.     DC.L    $EEEEEEEE
  928.  
  929.     DC.L    $EEEEEEEE
  930.     DC.L    $EEEEEEEE
  931.     DC.L    $EEEEEEEE
  932.     DC.L    $EEEEEEEE
  933.  
  934.     DC.B    $EE            ;VBLANK FREQU
  935.     DC.B    $EE            ;POWER SUPPLY FREQU
  936.     
  937.     DC.L    $EEEEEEEE
  938.     DC.L    $EEEEEEEE
  939.     DC.L    $EEEEEEEE
  940.     DC.W    $EEEE
  941.  
  942.     DC.L    $EEEEEEEE
  943.     DC.L    $EEEEEEEE
  944.     DC.W    $EEEE
  945.  
  946.     DS.B    12
  947.     DS.B    20
  948.     DS.B    $2C
  949. _EMAXSIZE
  950.  
  951.     IFNE    _EMAXSIZE-_EXECLIBBASE-$278
  952.     FAIL
  953.     ENDC
  954.  
  955.  
  956.     IFNE    CORRECTDEVICES
  957. _TDDMSGPORT
  958.     DC.L    0
  959.     DC.L    0
  960.     DC.B    NT_MSGPORT
  961.     DC.B    0
  962.     DC.L    _tdname
  963.  
  964.     dc.b    0
  965.     dc.b    0
  966.     DC.L    _EXECLIBTASK
  967.  
  968.     DC.L    0
  969.     DC.L    0
  970.     DC.L    0
  971.     DC.B    NT_MESSAGE
  972.     DC.B    0
  973.  
  974.     DC.L    1            ;DUE LORDS OF WAR -UNDOCUMENTED-
  975.  
  976.     ENDC
  977.  
  978.     cnop    0,4
  979. _DummyCList:                ; added by JOTD
  980.     dc.l    $FFFFFFFE
  981.  
  982. **************************************************************************
  983. *   VERSION                                                              *
  984. **************************************************************************
  985.  
  986.     IFND BARFLY
  987.         DC.B    '$VER: OS_EMUMODULE 0.26 +DEV (05-dec-1998 8:00:00)',0
  988.     ELSE
  989.         dc.b    "$VER: OSEmu "
  990.         DOSCMD    "WDate >T:date"
  991.         INCBIN    "T:date"
  992.         dc.b    0
  993.         dc.b    "$Id: osemu.asm 1.2 1999/02/03 04:10:48 jotd Exp jotd $"
  994.     ENDC
  995.     EVEN
  996.  
  997. **************************************************************************
  998. *   GLOBAL INITIALIZATION                                                *
  999. **************************************************************************
  1000. ;REQUIRES NOW AT LEAST WHDLOAD 7.0
  1001. ;ALTHOUGH THERE IS NO MULTITASKING IMPLEMENTED AT THE MOMENT,
  1002. ;ALL FUNCTIONS MUST BE IMPLEMENTED REENTRANTLY
  1003. ;
  1004. ; IN:    A0 = resload base
  1005. ;    A1 = pointer to slave structure
  1006. ; OUT:    A1 = ioreq of trackdisk.device
  1007. ;    A6 = execbase
  1008.  
  1009. _Init        movem.l    d0-a0/a2-a5,-(a7)
  1010.  
  1011.         cmp.w    #7,(ws_Version,a1)    ;minimum version
  1012.         blo    _ill
  1013.  
  1014.         move.l    a0,_RESLOAD
  1015.         move.l    a1,(_Slave)
  1016.  
  1017.     ;install a default copperlist
  1018.  
  1019.         move.l    #_DummyCList,(_custom+cop1lc)
  1020.  
  1021.     ;correct structures
  1022. BCPLCORRECT    MACRO
  1023.         move.l    \1,d0
  1024.         lsr.l    #2,d0
  1025.         move.l    d0,\1
  1026.         ENDM
  1027.         BCPLCORRECT    _bcplcorrect1
  1028.         BCPLCORRECT    _bcplcorrect2
  1029.  
  1030.     ;init memory managment
  1031.  
  1032.     ; chip memory
  1033.  
  1034.         lea    _osemu_end,a0        ;FIRST CLEAR WHOLE TABLE (MARK MEM AS USED)
  1035.         move.l    (ws_BaseMemSize,a1),d0
  1036.         SUBQ.L    #8,D0
  1037.         LSR.L    #3,D0            ;OK, AMOUNT OF BITS TO CLEAR IS IN D0
  1038.         LSR.L    #3,D0            ;AMOUNT OF BYTES TO CLEAR IN D0
  1039. .1        CLR.B    (A0)+
  1040.         SUBQ.L    #1,D0
  1041.         BPL.S    .1
  1042.         MOVE.L    A0,ALLOCMTABSIZE
  1043.         move.l    (ws_BaseMemSize,a1),d0
  1044.         SUB.L    A0,D0
  1045.         SUB.L    #$1000,D0        ;$1000 SYSTEM STACK ON TOP
  1046.         MOVE.L    A0,A1            ;FREE APPROPRIATE SIZE
  1047.         BSR    FREEM
  1048.  
  1049.     ; fast memory if available
  1050.  
  1051. ;;    clr.l    OSM_EXPMEM
  1052.  
  1053.         move.l    OSM_EXPMEM,a0        ;FIRST CLEAR WHOLE TABLE (MARK MEM AS USED)
  1054.         cmp.l    #0,A0
  1055.         beq.b    .nofast
  1056.     
  1057.         move.l    OSM_EXPSIZE,d0
  1058.         SUBQ.L    #8,D0
  1059.         LSR.L    #3,D0            ;OK, AMOUNT OF BITS TO CLEAR IS IN D0
  1060.         LSR.L    #3,D0            ;AMOUNT OF BYTES TO CLEAR IN D0
  1061. .2        CLR.B    (A0)+
  1062.         SUBQ.L    #1,D0
  1063.         BPL.S    .2
  1064.         MOVE.L    A0,ALLOCFASTMTABSIZE    ; not real size!
  1065.  
  1066.         move.l    OSM_EXPSIZE,d0
  1067.         add.l    OSM_EXPMEM,D0        ; adds expbase
  1068.         SUB.L    A0,D0            ; substracts expbase+tabsize
  1069.         SUB.L    #$100,D0        ;$100 safety
  1070.  
  1071.         MOVE.L    A0,A1            ;FREE APPROPRIATE SIZE
  1072.         BSR    FREEM
  1073.  
  1074. .nofast:
  1075.     ;allocate stack
  1076.         move.l    #USPLENGTH,d0
  1077.         moveq    #MEMF_PUBLIC,d1    ; MEMF_CHIP removed
  1078.         bsr    ALLOCM
  1079.         move.l    d0,a0
  1080.         MOVE.L    A0,_EXECLIBTASK+TC_SPLOWER
  1081.         add.l    #USPLENGTH-4,a0
  1082.         move.l    a0,usp
  1083.         MOVE.L    A0,_EXECLIBTASK+pr_StackBase
  1084.         MOVE.L    #USPLENGTH-$20,(A0)+
  1085.         MOVE.L    A0,_EXECLIBTASK+TC_SPUPPER
  1086.  
  1087.     ;get whdload vars
  1088.         lea    _tags,a0
  1089.         move.l    _RESLOAD,a1
  1090.         jsr    (resload_Control,a1)
  1091.  
  1092.     ;init libraries
  1093.         bsr    CIAAINIT        ;required because int handling
  1094.         bsr    CIABINIT        ;required because int handling
  1095.         bsr    EXECINIT
  1096.         bsr    GFXINIT            ;required for display init (copper)
  1097.         IFNE    CORRECTDEVICES
  1098.         BSR.W    MAKEDEVICELIST
  1099.         ENDC
  1100.         move.w    #INTF_SETCLR!INTF_INTEN!INTF_EXTER!INTF_VERTB!INTF_PORTS,(_custom+intena)
  1101.  
  1102.  
  1103.     ;flush caches
  1104.         move.l    (_RESLOAD),a0
  1105.         jsr    (resload_FlushCache,a0)
  1106.  
  1107.     ;prepare return values
  1108.         move.l    (4),a6
  1109.         move.l    #$400+IOTD_SIZE,d0
  1110.         moveq    #0,d1
  1111.         jsr    (_LVOAllocMem,a6)
  1112.         move.l    d0,a2
  1113.         lea    (_tdname),a0
  1114.         moveq    #0,d0
  1115.         move.l    a2,a1
  1116.         moveq    #0,d1
  1117.         jsr    (_LVOOpenDevice,a6)
  1118.         move.l    a2,a1
  1119.         lea    (IOTD_SIZE,a2),a0
  1120.         move.l    a0,(IO_DATA,a1)
  1121.         move.l    #$400,(IO_LENGTH,a1)
  1122.         clr.l    (IO_OFFSET,a1)
  1123.         move.w    #CMD_READ,(IO_COMMAND,a1)
  1124.  
  1125.         movem.l    (a7)+,d0-a0/a2-a5
  1126.  
  1127.         rts
  1128.  
  1129. ; Added by JOTD: enter debugger (useful for debugging with JST)
  1130.  
  1131. EnterDebugger:
  1132.     move.l    A0,-(A7)
  1133.     move.l    OSM_DEBUGENTRY,A0
  1134.     cmp.l    #0,A0
  1135.     beq.b    .exit
  1136.     jsr    (A0)
  1137. .exit
  1138.     move.l    (A7)+,A0
  1139.     rts
  1140.  
  1141. **************************************************************************
  1142. *   MISC FUNCTIONS                                                       *
  1143. **************************************************************************
  1144. ;-----------------------------------------------
  1145. ; IN:    D0 = ULONG size of jmp table
  1146. ;    D1 = ULONG size of variable area
  1147. ;    A0 = CPTR  subsystem name
  1148. ; OUT:    D0 = APTR  librarybase
  1149.  
  1150. _InitStruct    movem.l    d0-d1/a0,-(a7)
  1151.         add.l    d1,d0
  1152.         moveq    #MEMF_CHIP,d1        ;changed by JOTD
  1153.         bsr    ALLOCM
  1154.         move.l    d0,a0            ;jmp table start
  1155.                 move.l    d0,a1
  1156.         add.l    (a7),a1            ;jmp table end
  1157.  
  1158.         lea    _LVOFail,a2
  1159. .1        move.w    #$4EB9,(A0)+
  1160.         move.l    a2,(a0)+
  1161.         cmp.l    a0,a1
  1162.         bhi    .1
  1163.         move.l    (8,a7),-4(a0)        ;name of library
  1164.         move.l    a0,(A7)            ;library base
  1165.         move.l    a0,a1            ;variables start
  1166.         add.l    (4,a7),a1        ;variables end
  1167. .2        move.w    #$eeee,(a0)+
  1168.         cmp.l    a0,a1
  1169.         bhi    .2
  1170.         MOVEM.L    (A7)+,D0/D1/A0
  1171.         rts
  1172.  
  1173. _InitLibrary    BSR.S    _InitStruct
  1174.         MOVE.L    D0,A1
  1175.         MOVE.B    #NT_LIBRARY,LN_TYPE(A1)
  1176.         SF    LN_PRI(A1)
  1177.         move.l    A0,LN_NAME(A1)        ;name of library
  1178.         LEA.L    _LIBLIST(PC),A0
  1179.         BSR.W    _ADDTAIL
  1180.         rts
  1181.  
  1182.     IFNE    CORRECTDEVICES
  1183. _InitDevice    BSR.S    _InitStruct
  1184.         MOVE.L    D0,A1
  1185.         MOVE.B    #NT_LIBRARY,LN_TYPE(A1)
  1186.         SF    LN_PRI(A1)
  1187.         move.l    A0,LN_NAME(A1)        ;name of library
  1188.         LEA.L    _DEVLISTC(PC),A0
  1189.         BSR.W    _ADDTAIL
  1190.         rts
  1191.     ENDC
  1192.  
  1193. _LVOFail    exg.l    d0,a6
  1194.         sub.l    d0,(a7)            ;LVO
  1195.         exg.l    d0,a6
  1196.         subq.l    #6,(a7)
  1197.         move.l    (-4,a6),-(a7)        ;name of library
  1198. _emufail    pea    TDREASON_OSEMUFAIL
  1199.         move.l    _RESLOAD(pc),-(a7)
  1200.         addq.l    #resload_Abort,(a7)
  1201. _rts        rts
  1202.  
  1203. EMUFAIL        MACRO
  1204.         pea    \1
  1205.         pea    \2
  1206.         bra    _emufail
  1207.         ENDM
  1208. EXECFAIL    MACRO
  1209.         EMUFAIL    \1,_execname
  1210.         ENDM
  1211. GFXFAIL        MACRO
  1212.         EMUFAIL    \1,_gfxname
  1213.         ENDM
  1214.  
  1215. ;-----------------------------------------------
  1216. ; IN:    A0 = CPTR  string 1
  1217. ;    A0 = CPTR  string 2
  1218. ; OUT:    D0 = LONG  0 if strings are equal
  1219.  
  1220. _strcmp        movem.l    a0-a1,-(a7)
  1221. .1        cmpm.b    (a0)+,(a1)+
  1222.         bne    .not
  1223.         tst.b    (-1,a0)
  1224.         bne    .1
  1225.         move    #0,d0
  1226.         movem.l    (a7)+,a0-a1
  1227.         rts
  1228.  
  1229. .not        moveq    #-1,d0
  1230.         movem.l    (a7)+,a0-a1
  1231.         rts
  1232.  
  1233. ;-----------------------------------------------
  1234. ; wait for vertical blank
  1235.  
  1236. _waitvb
  1237. .1        btst    #0,(_custom+vposr+1)
  1238.         beq    .1
  1239. .2        btst    #0,(_custom+vposr+1)
  1240.         bne    .2
  1241.         rts
  1242.  
  1243. _ill        illegal
  1244.  
  1245. **************************************************************************
  1246. *   EXEC LIBRARY                                                         *
  1247. **************************************************************************
  1248.  
  1249. EXEC2INIT
  1250.     move.l    A6,D0    ; NightShift tries to open exec.library!
  1251.     rts
  1252.  
  1253. **************************************************************************
  1254. *   INITIALIZATION                                                       *
  1255. **************************************************************************
  1256.  
  1257. EXECINIT
  1258.     ;    move.l    4,d0
  1259.     ;    btst    #0,d0
  1260.     ;    bne    .init
  1261.     ;    rts
  1262.  
  1263. .init        lea    _EXECMINSIZE(PC),A0
  1264.         LEA.L    _EXECLIBBASE(PC),A1
  1265.         lea    _LVOFail,a2
  1266. .1        move.w    #$4EB9,(A0)+
  1267.         move.l    a2,(a0)+
  1268.         cmp.l    a0,a1
  1269.         bhi    .1
  1270.         move.l    #_execname,-4(a0)    ;name of library
  1271.         MOVE.L    a1,a0
  1272.         move.l    a0,$4.W
  1273.         
  1274.         patch    _LVOOldOpenLibrary(a0),OPENLIB(pc)
  1275.         patch    _LVOOpenLibrary(a0),OPENLIB(pc)
  1276.         patch    _LVOCloseLibrary(A0),MYRTS(PC)
  1277.  
  1278.         patch    _LVOAllocMem(a0),ALLOCM(PC)
  1279.         patch    _LVOFreeMem(a0),FREEM(PC)
  1280.         patch    _LVOAvailMem(a0),AVAILM(PC)
  1281.         patch    _LVOAllocAbs(a0),ALLOCA(PC)
  1282.         patch    _LVOCopyMem(A0),_COPYMEM(PC)
  1283.         patch    _LVOAllocEntry(a0),ALLOCENTRY(PC)
  1284.         patch    _LVOFreeEntry(a0),FREEENTRY(PC)
  1285.  
  1286.         patch    _LVOForbid(a0),MYRTS(PC)
  1287.         patch    _LVOPermit(a0),MYRTS(PC)
  1288.         patch    _LVOSetIntVector(A0),_SETINTVECTOR(PC)
  1289.         patch    _LVOAddIntServer(a0),_AddIntServer(PC)
  1290.         patch    _LVORemIntServer(a0),_RemIntServer(PC)
  1291.         patch    -$24(A0),_ExitIntr(PC)
  1292.     ;    patch    _LVOEnqueue(a0),_Enqueue(PC)
  1293.         patch    _LVOOpenResource(a0),OPENRES(PC)
  1294.         patch    _LVOSupervisor(a0),_Supervisor(PC)
  1295.         patch    _LVOSuperState(a0),_SuperState(PC)
  1296.         patch    _LVOUserState(a0),_UserState(PC)
  1297.         patch    _LVOFindTask(a0),_FINDTASK(PC)
  1298.         patch    _LVORemTask(a0),MYRTS(PC)
  1299.         patch    _LVOSetTaskPri(A0),MYRTZ(PC)
  1300.  
  1301.         patch    _LVOAddPort(a0),MYRTS(PC)
  1302.         patch    _LVOOpenDevice(a0),_OpenDevice(PC)
  1303.         patch    _LVODoIO(a0),_DoIO(PC)
  1304.         patch    _LVOWaitIO(A0),_WAITIO(PC)    ; uncommented by JOTD
  1305.         patch    _LVOAbortIO(A0),_ABORTIO(PC)
  1306.         patch    _LVOCheckIO(A0),_CHECKIO(PC)    ; added by JOTD
  1307.         patch    _LVOSendIO(a0),_SendIO(PC)
  1308.         patch    _LVOCloseDevice(a0),MYRTS(PC)
  1309.         patch    _LVORemPort(a0),MYRTS(PC)
  1310.  
  1311.         patch    _LVOAllocSignal(a0),_AllocSignal(PC)
  1312.         patch    _LVOFreeSignal(a0),_FreeSignal(PC)
  1313.         patch    _LVOSetSignal(a0),_SetSignal(PC)
  1314.         patch    _LVODisable(a0),_Disable(PC)
  1315.         patch    _LVOEnable(a0),_Enable(PC)
  1316.         patch    _LVOWaitPort(A0),MYRTS(PC)
  1317.         patch    _LVOGetMsg(A0),MYRTZ(PC)
  1318.         patch    _LVOCreateIORequest(A0),_CreateIORequest(PC)
  1319.         patch    _LVODeleteIORequest(A0),_DeleteIORequest(PC)
  1320.         patch    _LVOCreateMsgPort(A0),_CreateMsgPort(PC)
  1321.         patch    _LVODeleteMsgPort(A0),_DeleteMsgPort(PC)
  1322.  
  1323.         patch    _LVOInsert(A0),_INSERT(PC)
  1324.         patch    _LVOAddHead(A0),_ADDHEAD(PC)
  1325.         patch    _LVOAddTail(A0),_ADDTAIL(PC)
  1326.         patch    _LVORemove(A0),_REMOVE(PC)
  1327.         patch    _LVORemHead(A0),_REMHEAD(PC)
  1328.         patch    _LVORemTail(A0),_REMTAIL(PC)
  1329.         patch    _LVOFindName(A0),_FINDNAME(PC)
  1330.  
  1331.         patch    _LVOCacheControl(A0),MYRTZ(PC)    ; added by JOTD
  1332.         patch    _LVOCacheClearU(A0),_CacheClearU(PC)    ; added by JOTD
  1333.         patch    _LVOSetFunction(A0),_SetFunction(PC)    ; added by JOTD
  1334.         patch    _LVOFindResident(A0),_FindResident(PC)    ; added by JOTD
  1335.  
  1336.         move.w    (_attnflags),(AttnFlags,a0)
  1337.  
  1338.         MOVE.L    _Slave(PC),A1
  1339.         MOVE.L    ws_BaseMemSize(A1),A1
  1340.         MOVE.L    A1,SysStkUpper(A0)
  1341.         MOVE.L    A1,MaxLocMem(A0)
  1342.         LEA.L    -$1000(A1),A1
  1343.         MOVE.L    A1,SysStkLower(A0)
  1344.         MOVE.L    _monitor(PC),D0
  1345.         MOVEQ.L    #60,D1
  1346.         AND.L    #$FFFF1000,D0
  1347.         CMP.L    #$21000,D0
  1348.         BNE.S    .nopal
  1349.         moveq.l    #50,D1
  1350. .nopal
  1351.         move.b    d1,VBlankFrequency(A0)
  1352.  
  1353.     ;clear int table
  1354.         lea    (IntVects,a0),a1
  1355.         moveq    #16*IV_SIZE/4-1,d0
  1356. .c1        MOVE.L    #$DDDDDDDD,(a1)+
  1357.         dbf    d0,.c1
  1358.     ;init int table
  1359.         LEA.L    (IVPORTS,A0),A1
  1360.         MOVE.L    A1,(IV_DATA,a1)
  1361.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1362.         move.l    #INTSERVNODE_CIAA,(IV_NODE,a1)
  1363.  
  1364.         LEA.L    (IVCOPER,A0),A1
  1365.         MOVE.L    A1,(IV_DATA,a1)
  1366.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1367.         CLR.L    (IV_NODE,a1)
  1368.  
  1369.         LEA.L    (IVVERTB,A0),A1
  1370.         MOVE.L    A1,(IV_DATA,a1)
  1371.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1372.         CLR.L    (IV_NODE,a1)
  1373.  
  1374.         LEA.L    (IVEXTER,A0),A1
  1375.         MOVE.L    A1,(IV_DATA,a1)
  1376.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1377.         move.l    #INTSERVNODE_CIAB,(IV_NODE,a1)
  1378.  
  1379.         LEA.L    (IVAUD0,A0),A1
  1380.         MOVE.L    A1,(IV_DATA,a1)
  1381.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1382.         move.l    #INTSERVNODE_AUDIO0,(IV_NODE,a1)
  1383.  
  1384.         LEA.L    (IVAUD1,A0),A1
  1385.         MOVE.L    A1,(IV_DATA,a1)
  1386.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1387.         move.l    #INTSERVNODE_AUDIO1,(IV_NODE,a1)
  1388.  
  1389.         LEA.L    (IVAUD2,A0),A1
  1390.         MOVE.L    A1,(IV_DATA,a1)
  1391.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1392.         move.l    #INTSERVNODE_AUDIO2,(IV_NODE,a1)
  1393.  
  1394.         LEA.L    (IVAUD3,A0),A1
  1395.         MOVE.L    A1,(IV_DATA,a1)
  1396.         MOVE.L    #INT_SERVER,(IV_CODE,A1)
  1397.         move.l    #INTSERVNODE_AUDIO3,(IV_NODE,a1)
  1398.  
  1399.     ;init hardware ints
  1400.         move.l    #INT_68,$68
  1401.         move.l    #INT_6c,$6c
  1402.         MOVE.L    #INT_70,$70
  1403.         move.l    #INT_78,$78
  1404.  
  1405.         move.b    #$1f,$bfed01
  1406.         MOVE.B    #$8F,$BFED01
  1407.         tst.B    $BFED01
  1408.         move.b    #$1f,$bfdd00
  1409. ;        MOVE.B    #$87,$BFDD00    ; OS not enable TOD int (Mr.Larmer)
  1410.         MOVE.B    #$83,$BFDD00
  1411.         tst.b    $bfdd00
  1412.         
  1413.         move.w    #$7fff,(_custom+intena)
  1414.  
  1415.         rts
  1416.  
  1417.     IFNE    CORRECTDEVICES
  1418. MAKEDEVICELIST
  1419.         MOVE.L    4.W,A0
  1420.         move.l    #$24,d0
  1421. ;        move.l    #LIB_SIZE,d1
  1422.         move.l    #LIB_SIZE+$a,d1
  1423.         lea    _tdname(PC),a0
  1424.         bsr    _InitDevice
  1425.         MOVE.L    d0,_tddevtable+4
  1426.         MOVE.L    D0,A0
  1427.         CLR.L    $28(A0)            ;DUE LORDS OF WAR
  1428.         MOVE.L    #_TDDMSGPORT,$24(A0)    ;-"-
  1429.         move.l    #$24,d0
  1430.         move.l    #LIB_SIZE,d1
  1431.         lea    _inpname(PC),a0
  1432.         bsr    _InitDevice
  1433.         MOVE.L    d0,_inpdevtable+4
  1434.         move.l    #$24,d0
  1435.         move.l    #LIB_SIZE,d1
  1436.         lea    _audname(PC),a0
  1437.         bsr    _InitDevice
  1438.         MOVE.L    d0,_auddevtable+4
  1439.  
  1440.         MOVE.L    D0,A0
  1441.         patch    -$1E(A0),_SENDAUDIO(PC)
  1442.  
  1443.         move.l    #$24,d0        ; cd.device, added by JOTD
  1444.         move.l    #LIB_SIZE,d1
  1445.         lea    _cdname(PC),a0
  1446.         bsr    _InitDevice
  1447.         MOVE.L    d0,_cddevtable+4
  1448.  
  1449.         move.l    #$24,d0        ; cdtv.device, added by JOTD
  1450.         move.l    #LIB_SIZE,d1
  1451.         lea    _cdtvname(PC),a0
  1452.         bsr    _InitDevice
  1453.         MOVE.L    d0,_cdtvdevtable+4
  1454.  
  1455.         move.l    #$24,d0        ; dummy console.device
  1456.         move.l    #LIB_SIZE,d1
  1457.         lea    _condevname(PC),a0
  1458.         bsr    _InitDevice
  1459.         MOVE.L    d0,_condevtable+4
  1460.  
  1461.         move.l    #$24,d0
  1462. ;        move.l    #LIB_SIZE,d1
  1463.         move.l    #$14C,d1
  1464.         lea    _kbdevname(PC),a0
  1465.         bsr    _InitDevice
  1466.         MOVE.L    d0,_kbdevtable+4
  1467.  
  1468.         move.l    d0,INTSERVNODE_SP+IS_DATA
  1469.  
  1470.         move.l    d0,a0
  1471.         lea    $70(a0),a0
  1472.         move.l    #$14C-$70-1,d0
  1473. .clear
  1474.         clr.b    (a0)+
  1475.         dbf    d0,.clear
  1476.  
  1477.         RTS
  1478.  
  1479.     ENDC
  1480.  
  1481. MYRTZ        MOVEQ.L    #0,D0
  1482. MYRTS        RTS
  1483.  
  1484. **************************************************************************
  1485. *   MISC EXEC FUCTIONS                                                   *
  1486. **************************************************************************
  1487.  
  1488. _CacheClearU
  1489.         movem.l    A0,-(A7)
  1490.         move.l    (_RESLOAD),a0
  1491.         jsr    (resload_FlushCache,a0)
  1492.         movem.l    (A7)+,A0
  1493.         rts
  1494.  
  1495. _FindResident:
  1496.     moveq.l    #0,D0
  1497.     rts
  1498.  
  1499. _SetFunction                ; added by JOTD (Banshee)
  1500.         movem.l    D1,-(A7)
  1501.         move.l    2(A1,A0.W),D1
  1502.         move.l    D0,2(A1,A0.W)    ; changed
  1503.         move.l    D1,D0        ; old function
  1504.         movem.l    (A7)+,D1
  1505.         rts
  1506.  
  1507. _Supervisor    move.l    $bc,.s1
  1508.         move.l    #.c1,$bc
  1509.         trap    #15
  1510.         rts
  1511. .c1        move.l    .s1,$bc
  1512.         jmp    (a5)
  1513. .s1        dc.l    0
  1514.  
  1515. _SuperState    MOVE.L    A5,A0
  1516.         LEA       .ac,A5
  1517.         JMP       _LVOSupervisor(A6)
  1518. .ac        MOVE.L    A0,A5
  1519.         MOVEQ     #$00,D0
  1520.         BSET      #$05,(A7)
  1521.         BNE.S     .ca
  1522.         MOVE.W    (A7)+,SR
  1523.         MOVE.L    A7,D0
  1524.         MOVE.L    USP,A7
  1525.         BTST      #$00,$0129(A6)
  1526.         BEQ.S     .c6
  1527.         ADDQ.L    #$2,D0
  1528. .c6        ADDQ.L    #$4,D0
  1529.         RTS
  1530. .ca        RTE
  1531.  
  1532. _UserState    MOVE.L    (A7)+,A0
  1533.         MOVE.L    A7,USP
  1534.         MOVE.L    D0,A7
  1535.         ANDI.W    #$dfff,SR
  1536.         JMP       (A0)
  1537.  
  1538.  
  1539. _CreateIORequest
  1540.     movem.l    D2/D3,-(SP)
  1541.     move.l    D0,D2
  1542.     move.l    A0,D3
  1543.     beq.s    .error
  1544.     move.l    #$10001,D1
  1545.     jsr    _LVOAllocMem(A6)
  1546.     movea.l    D0,A0
  1547.     tst.l    D0
  1548.     beq.s    .error
  1549.     move.b    #NT_REPLYMSG,LN_TYPE(A0)
  1550.     move.l    D3,MN_REPLYPORT(A0)
  1551.     move.w    D2,MN_LENGTH(A0)
  1552. .error
  1553.     move.l    A0,D0
  1554.     movem.l    (SP)+,D2/D3
  1555.     rts
  1556.  
  1557. _DeleteIORequest
  1558.     move.l    A0,D0
  1559.     beq.s    .abort
  1560.     moveq    #-1,D0
  1561.     move.l    D0,LN_SUCC(A0)
  1562.     move.l    D0,IO_DEVICE(A0)
  1563.     moveq    #0,D0
  1564.     move.w    MN_LENGTH(A0),D0
  1565.     movea.l    A0,A1
  1566.     jsr    _LVOFreeMem(A6)
  1567. .abort
  1568.     rts
  1569.  
  1570. _CreateMsgPort
  1571.     moveq    #MP_SIZE,D0    ;$22,D0
  1572.     move.l    #$10001,D1
  1573.     jsr    _LVOAllocMem(A6)
  1574.     move.l    D0,-(SP)
  1575.     beq.s    .error
  1576.     moveq    #-1,D0
  1577.     jsr    _LVOAllocSignal(A6)
  1578.     movea.l    (SP),A0
  1579.     move.b    #NT_MSGPORT,LN_TYPE(A0)
  1580.     move.b    #PA_SIGNAL,MP_FLAGS(A0)
  1581.     move.b    D0,MP_SIGBIT(A0)
  1582.     bmi.s    .abort
  1583.     move.l    ThisTask(A6),MP_SIGTASK(A0)
  1584.     lea    MP_MSGLIST(A0),A1
  1585.     move.l    A1,8(A1)
  1586.     addq.l    #4,A1
  1587.     clr.l    (A1)
  1588.     move.l    A1,-(A1)
  1589. .error
  1590.     move.l    (SP)+,D0
  1591.     rts
  1592.  
  1593. .abort
  1594.     moveq    #MP_SIZE,D0
  1595.     movea.l    A0,A1
  1596.     jsr    _LVOFreeMem(A6)
  1597.     clr.l    (SP)
  1598.     bra.s    .error
  1599.  
  1600. _DeleteMsgPort
  1601.     move.l    A0,-(SP)
  1602.     beq.s    .abort
  1603.     moveq    #0,D0
  1604.     move.b    MP_SIGBIT(A0),D0
  1605.     jsr    _LVOFreeSignal(A6)
  1606.     movea.l    (SP),A1
  1607.     moveq    #-1,D0
  1608.     move.l    D0,MP_MSGLIST(A1)
  1609.     move.l    D0,LN_SUCC(A1)
  1610.     moveq    #MP_SIZE,D0
  1611.     jsr    _LVOFreeMem(A6)
  1612. .abort
  1613.     addq.l    #4,SP
  1614.     rts
  1615.  
  1616.  
  1617. **************************************************************************
  1618. *   Task related functions                                               *
  1619. **************************************************************************
  1620.  
  1621. _AllocSignal
  1622.     movea.l    ThisTask(A6),A1
  1623.     move.l    TC_SIGALLOC(A1),D1
  1624.     cmp.b    #-1,D0
  1625.     beq.s    .search
  1626.     bset    D0,D1
  1627.     beq.s    .free
  1628.     bra.s    .err
  1629.  
  1630. .search
  1631.     moveq.l    #$20-1,D0
  1632. .search2
  1633.     bset    D0,D1
  1634.     beq.s    .free
  1635.     dbra    D0,.search2
  1636. .err
  1637.     moveq.l    #-1,D0
  1638.     rts
  1639.  
  1640. .free
  1641.     move.l    D1,TC_SIGALLOC(A1)
  1642.     moveq    #-1,D1
  1643.     bclr    D0,D1
  1644.     and.l    D1,TC_SIGRECVD(A1)
  1645.     and.l    D1,TC_SIGEXCEPT(A1)
  1646.     and.l    D1,TC_SIGWAIT(A1)
  1647.     rts
  1648.  
  1649. _FreeSignal
  1650.         cmp.b    #$FF,D0
  1651.         beq.s    .skip            ; Mr Larmer: no more error
  1652.         movea.l    ThisTask(A6),A1
  1653.         move.l    TC_SIGALLOC(A1),D1
  1654.         bclr    D0,D1
  1655.         move.l    D1,TC_SIGALLOC(A1)
  1656. .skip
  1657.         rts
  1658.  
  1659.  
  1660. _SetSignal    MOVE.L    ThisTask(A6),A0
  1661.         MOVE.L    TC_SIGRECVD(A0),-(A7)
  1662.         AND.L    D1,D0
  1663.         NOT.L    D1
  1664.         AND.L    TC_SIGRECVD(A0),D1
  1665.         OR.L    D0,D1
  1666.         MOVE.L    D1,TC_SIGRECVD(A0)
  1667.         MOVE.L    (A7)+,d0
  1668.         rts
  1669.  
  1670. _Disable
  1671.         move.w    #INTF_INTEN,(_custom+intena)
  1672.         rts
  1673. _Enable
  1674.         move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  1675.         rts
  1676.  
  1677. _FINDTASK    MOVE.L    A1,-(A7)    ;fails if not own task searched
  1678.         TST.L    (A7)+
  1679.         BNE.S    .FAIL
  1680.         MOVE.L    4.W,A0
  1681.         MOVE.L    ThisTask(A0),D0
  1682.         RTS
  1683.  
  1684. .FAIL
  1685. ;        MOVEQ.L    #0,d0
  1686. ;        rts
  1687.         pea    _LVOFindTask
  1688.         pea    _execname
  1689.         bra    _emufail
  1690.  
  1691. **************************************************************************
  1692. *   MEMORYFUNCTIONS                                                      *
  1693. **************************************************************************
  1694.  
  1695. ; AllocEntry(): Added by JOTD by request of Bored Seal
  1696. ; Tested on DragonNinja
  1697.  
  1698. ; < A0: memList
  1699. ; > D0: allocated memList
  1700.  
  1701. ALLOCENTRY:
  1702.     movem.l    D1-A6,-(A7)
  1703.     move.l    A0,A5
  1704.     moveq.l    #0,D0
  1705.     move.w    LN_SIZE(A5),D0
  1706.     lsl.l    #3,D0
  1707.     add.l    #$10,D0
  1708.     move.l    D0,D5        ; size
  1709.     move.l    #MEMF_PUBLIC,D1
  1710.     jsr    (_LVOAllocMem,a6)
  1711.     move.l    D0,D6
  1712.     beq.b    .fail
  1713.  
  1714.     ; allocated OK
  1715.  
  1716.     move.l    D6,A4
  1717.  
  1718.     moveq.l    #0,D0
  1719.     move.l    A5,A0
  1720.     move.l    A4,A1
  1721.     move.l    D5,D0
  1722.     jsr    (_LVOCopyMem,a6)
  1723.  
  1724.     moveq.l    #0,D2
  1725.     move.w    LN_SIZE(A4),D2    ; # of items
  1726.     
  1727.     add.l    #LN_SIZE+2,A4
  1728. .loop
  1729.     move.l    (A4)+,D1    ; flags
  1730.     move.l    (A4)+,D0    ; size
  1731.     jsr    (_LVOAllocMem,a6)
  1732.     beq.b    .fail        ; alloc problem
  1733.     move.l    D0,-8(A4)    ; store memblock start in flags (union)
  1734.     subq.l    #1,D2
  1735.     bne.b    .loop
  1736.  
  1737.     move.l    D6,D0        ; new memlist
  1738. .exit
  1739.     movem.l    (A7)+,D1-A6
  1740.     rts
  1741.  
  1742. .fail:
  1743.     moveq.l    #0,D0
  1744.     bset    #31,D0
  1745.     bra.b    .exit
  1746.  
  1747. ; FreeEntry(): still untested but should work
  1748.  
  1749. FREEENTRY:
  1750.  
  1751.     movem.l    D1-A6,-(A7)
  1752.     move.l    A0,A4
  1753.  
  1754.     move.w    LN_SIZE(A4),D2    ; # of items
  1755.     
  1756.     add.l    #LN_SIZE+2,A4
  1757. .loop
  1758.     move.l    (A4)+,A1    ; memory pointer
  1759.     move.l    (A4)+,D0    ; memory size
  1760.     jsr    (_LVOFreeMem,a6)
  1761.     subq.l    #1,D2
  1762.     bne.b    .loop
  1763.  
  1764. .exit
  1765.     movem.l    (A7)+,D1-A6
  1766.     rts
  1767.  
  1768. _COPYMEM
  1769.     CMP.L    A0,A1
  1770.     BLS.S    .ASCEND
  1771. .DESCEND
  1772.     LEA.L    (A0,D0.L),A0
  1773.     LEA.L    (A1,D0.L),A1
  1774. .LD    MOVE.B    -(A0),-(A1)
  1775.     SUBQ.L    #1,D0
  1776.     BNE.S    .LD
  1777.     RTS
  1778.  
  1779. .ASCEND
  1780. .LA    MOVE.B    (A0)+,(A1)+
  1781.     SUBQ.L    #1,D0
  1782.     BNE.S    .LA
  1783.     RTS
  1784.  
  1785. FREEM
  1786.     TST.L    D0
  1787.     BNE.S    .NOZERO
  1788.     RTS
  1789.  
  1790. .NOZERO
  1791.     cmp.l    #$1000000,D0    ; JOTD: safety, I had to switch off my amy
  1792.     bcc.b    .FREEMFAIL    ; when the value passed was too high (here >16MB)!    
  1793.  
  1794.     CMP.L    #ALLOCMTAB,A1        ; above ALLOCMTAB
  1795.     BHS.S    .OK            ; okay, try to free
  1796. .FREEMFAIL
  1797.     pea    _LVOFreeMem
  1798.     pea    _execname
  1799.     bra    _emufail
  1800.  
  1801. .OK
  1802.     tst.l    OSM_EXPMEM
  1803.     beq.b    .FreeChip
  1804.  
  1805.     cmp.l    OSM_EXPMEM,A1
  1806.     bcs.b    .FreeChip    ; below expansion memory -> chipmem
  1807.  
  1808.     ; fast memory - added by JOTD
  1809.  
  1810. .FreeFast:
  1811.     move.l    OSM_EXPMEM,A0        ; start of memory expansion
  1812.     add.l    OSM_EXPSIZE,A0        ; size of memory expansion
  1813.  
  1814.     cmp.l    A0,A1
  1815.     bcc.b    .FREEMFAIL        ; trying to free above memory expansion
  1816.  
  1817.     move.l    OSM_EXPMEM,A0        ; start of memory table (fastmem)
  1818.     sub.l    A0,A1            ; corrects offset on address !!
  1819.     bra.b    .FreeGeneric        ; removed by Harry
  1820.  
  1821.     ; chip memory - Harry's original
  1822.  
  1823. .FreeChip:
  1824.     LEA.L    ALLOCMTAB,A0        ; start of memory table (chipmem)
  1825.  
  1826. .FreeGeneric:
  1827.     MOVEM.L    D2/D3/A2/A3,-(A7)
  1828.     MOVE.L    A1,D1
  1829.     ADDQ.L    #7,D0
  1830.     AND.L    #$FFFFFFF8,D1
  1831.     AND.L    #$FFFFFFF8,D0
  1832.     BEQ.S    .QU
  1833.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  1834.  
  1835.                     ;FREE MEM NOT ON A $40-BOUNDARY
  1836.                     ;EVAL BEGINBYTE
  1837.     MOVE.L    D1,D2
  1838.     LSR.L    #6,D2
  1839.     LEA.L    (A0,D2.L),A0
  1840.     MOVEM.L    D1,-(A7)
  1841.     AND.L    #$3F,D1
  1842.     BEQ.S    .CNTCLR
  1843.     LSR.L    #3,D1
  1844. .2    BSET    D1,(A0)
  1845.     ADDQ.L    #1,D1
  1846.     ADDQ.L    #8,(A7)
  1847.     SUBQ.L    #1,D0
  1848.     BEQ.S    .1
  1849.     CMP.L    #8,D1
  1850.     BEQ.S    .CNTCLR2
  1851.     BRA.S    .2
  1852.  
  1853. .1    MOVEM.L    (A7)+,D1
  1854.     BRA.S    .QU
  1855.  
  1856. .CNTCLR2
  1857.     ADDQ.L    #1,A0
  1858. .CNTCLR
  1859.     MOVEM.L    (A7)+,D1
  1860.  
  1861.                     ;CLEAR $40-BOUNDARY-BYTES
  1862. .3    CMP.L    #8,D0
  1863.     BLO.S    .CLREND
  1864.  
  1865.     ST    (A0)+
  1866.     SUBQ.L    #8,D0
  1867.     BRA.S    .3
  1868.  
  1869.  
  1870. .CLREND                    ;CLEAR END NOT ENDING ON A $40-
  1871.     TST.L    D0            ;BOUNDARY
  1872.     BEQ.S    .QU
  1873.     SUBQ.L    #1,D0
  1874.     BSET    D0,(A0)
  1875.     BRA.S    .CLREND
  1876.  
  1877. .QU    MOVEM.L    (A7)+,D2/D3/A2/A3
  1878.     RTS
  1879.  
  1880.  
  1881.  
  1882. ;>D0:SIZE
  1883. ;>D1:CONDITIONS
  1884. ;<D0:ADDY
  1885. ;LIMITATIONS:
  1886. ;        -MEM ALWAYS CLEARED (MEMF_CLEAR ASSUMED)
  1887. ;        -MEMORY IS $40-ALIGNED (SOME BYTES WASTED)
  1888. ;        -MEMF_LARGEST IS IGNORED AS IN THE OS
  1889. ;        -ATM, ALSO MEMF_REVERSE IS IGNORED
  1890.  
  1891. ALLOCM:
  1892.     tst.l    d0
  1893.     beq    .NOFAST    ; not fatal anymore, allows broken programs to work
  1894.  
  1895.     MOVE.L    D1,-(A7)
  1896.     and.l    #~(MEMF_REVERSE!MEMF_LARGEST!MEMF_FAST!MEMF_CHIP!MEMF_CLEAR!MEMF_PUBLIC),(A7)+
  1897.     bne    .fail        ; wrong flags
  1898.     btst    #MEMB_CHIP,d1    ; chipmem required?
  1899.     BEQ.S    .FMEM        ; JOTD: MEMB_CHIP not specified -> alloc fast
  1900.     
  1901. .NORMALCHIP
  1902.     MOVEM.L    D2-D5/A2/A3/A4,-(A7)
  1903.  
  1904.     addq.l    #7,d0
  1905.     LSR.L    #3,D0
  1906.     ;SEARCH SUFFICIENT BIG MEMAREA
  1907.  
  1908.     LEA.L    ALLOCMTAB,A0    ;FIND A BYTE != 0 (FREE MEM)
  1909.     move.l    ALLOCMTABSIZE,A3
  1910.     sub.l    A4,A4
  1911.  
  1912.     bsr    AllocGeneric
  1913.  
  1914.     MOVEM.L    (A7)+,D2-D5/A2/A3/A4
  1915.     RTS
  1916.  
  1917. .FMEM:
  1918.     tst.l    OSM_EXPMEM
  1919.     bne.b    .ALLOCFAST        ; expansion available: allocate
  1920.  
  1921.     ; no expansion: check if fast is required
  1922.  
  1923.     btst    #MEMB_FAST,d1
  1924.     bne.b    .NOFAST            ; fastmem not available: error
  1925.  
  1926.     bra.b    .NORMALCHIP        ; no fast memory configured: try chipmem
  1927.  
  1928. .ALLOCFAST
  1929.     MOVEM.L    D2-D5/A2/A3/A4,-(A7)
  1930.     addq.l    #7,d0
  1931.     LSR.L    #3,D0
  1932.     ;SEARCH SUFFICIENT BIG MEMAREA
  1933.  
  1934.     move.l    OSM_EXPMEM,A0    ;FIND A BYTE != 0 (FREE MEM)
  1935.     move.l    ALLOCFASTMTABSIZE,A3
  1936.     move.l    A0,A4        ; offset to add for ALLOCA
  1937.  
  1938.     bsr    AllocGeneric
  1939.  
  1940.     MOVEM.L    (A7)+,D2-D5/A2/A3/A4
  1941.     RTS
  1942.  
  1943. .NOFAST
  1944.     moveq.l    #0,D0
  1945.     rts
  1946.  
  1947. .fail    
  1948.     EXECFAIL _LVOAllocMem
  1949.  
  1950. ; Added by JOTD to be used with chip and fast alloc
  1951. ; < A0: alloc table
  1952. ; < A3: end of alloc table
  1953. ; < A4: offset to add to calculated address (0 for chip, OSM_EXPMEM for fast)
  1954.  
  1955. AllocGeneric:
  1956.     MOVEQ.L    #0,D4
  1957. .2
  1958.     CMP.B    #$FF,(A0)+
  1959.     BEQ.S    .1
  1960.     ADD.L    #$40,D4
  1961.     CMP.L    A3,A0
  1962.     BNE.S    .2
  1963.     BRA.S    .ERR
  1964.                     ;found free mem
  1965.                     ;CHECK NOW SIZE 
  1966. .1    SUBQ.L    #1,A0
  1967.                     ;D4-BASE
  1968. .3
  1969.     MOVE.L    D0,-(A7)        ;WANTED SIZE
  1970.     MOVE.L    D4,-(A7)        ;FOUND ADDRESS
  1971.  
  1972. .6    TST.L    D0
  1973.     BMI.S    .CHKEND
  1974.     CMP.B    #$FF,(A0)
  1975.     BNE.S    .TOOSMALL
  1976.     ADDQ.L    #1,A0        ;CHECK FOR EXCEEDING THE SIZE OF ALLOCMTAB
  1977.                 ;MAY BE OMITTED SINCE ITS END CONTAINS $0
  1978.     ADD.L    #$40,D4
  1979.     SUBQ.L    #8,D0
  1980.     BEQ.S    .CHKEND
  1981.     BRA.S    .6
  1982.  
  1983. .TOOSMALL                ;LATER TODO: FIND EVENTUAL ZEROBITS
  1984.  
  1985.     ADDQ.L    #4,A7            ;DISCARD D4 ON STACK
  1986.     MOVE.L    (A7)+,D0
  1987.     ADDQ.L    #1,A0
  1988. ;    AND.L    #$FFFFFFC0,D4
  1989.     ADD.L    #$40,D4
  1990.     BRA.S    .2
  1991.  
  1992. .CHKEND
  1993.     MOVE.L    (A7)+,D4
  1994.     MOVE.L    (A7)+,D0
  1995.     LSL.L    #3,D0
  1996. ;D0-SIZE
  1997. ;D4-ABS
  1998.     ;MARK AREA AS USED
  1999.     MOVE.L    D4,A1
  2000.     MOVE.L    D0,D2
  2001.  
  2002.     add.l    A4,A1            ; added by JOTD, offset for fastmem
  2003.     BSR.W    ALLOCA
  2004.                     ;MEMORYSPACE ALREADY SUCESSFULLY
  2005.                     ;CHECKED, RETURNCODE MAY BE IGNORED
  2006.  
  2007.     MOVE.L    A1,A2
  2008. ;    MOVE.L    D4,D2
  2009.     LSR.L    #2,D2
  2010.     BRA.S    .CLRM
  2011.  
  2012. .CLRM1    CLR.L    (A2)+
  2013. .CLRM    DBF    D2,.CLRM1
  2014. .exit
  2015.     tst.l    d0            ;some progs expect an correct set zero flag
  2016.     rts
  2017. .ERR:
  2018.     moveq.l    #0,D0            ; unable to allocate: table full
  2019.     rts
  2020.  
  2021. ;RETURNS AT THE MOMENT ONLY THE SIZE OF THE LARGEST CHUNK-$1000 SAFETY
  2022. AVAILM
  2023.     MOVEM.L    A2/A3/D2/D3,-(A7)
  2024.     MOVE.L    D1,D2
  2025.     AND.L    #MEMF_FAST,D2
  2026.     BNE.S    .FMEM
  2027.  
  2028.     ; check for chipmem available
  2029.  
  2030.     LEA.L    ALLOCMTAB,A0
  2031.     move.l    ALLOCMTABSIZE(pc),A3
  2032.  
  2033.     bsr    GenericAvail
  2034.  
  2035.  
  2036. .exit
  2037.     MOVEM.L    (A7)+,A2/A3/D2/D3
  2038.     RTS
  2039.  
  2040. .FMEM    
  2041.     move.l    OSM_EXPMEM,A0
  2042.     cmp.l    #0,A0
  2043.     beq.b    .nomem
  2044.     move.l    ALLOCFASTMTABSIZE(pc),A3
  2045.  
  2046.     bsr    GenericAvail
  2047.     bra.b    .exit
  2048.  
  2049. .nomem:
  2050.     moveq.l    #0,D0
  2051.     bra.b    .exit
  2052.     
  2053. ; for chip & fast memory
  2054.  
  2055. GenericAvail:
  2056.     MOVEQ.L    #0,D2
  2057.     MOVEQ.L    #0,D3
  2058. .3    MOVE.B    (A0)+,D0
  2059.     CMP.B    #$FF,D0            ;SEARCH CHUNK
  2060.     BNE.S    .1
  2061.     ADD.L    #$40,D3
  2062.     BRA.S    .2
  2063.  
  2064. .1    CMP.L    D2,D3            ;END OF CHUNK, COMPARE SIZE WITH
  2065.     BLO.S    .4            ;PREVIOUS SIZE
  2066.     MOVE.L    D3,D2            ;ACTUAL IS LARGER -> NEW LARGEST SIZE
  2067. .4    MOVEQ.L    #0,D3            ;RESET SIZE OF NEXT CHUNK
  2068. .2    CMP.L    A3,A0            ;UNTIL MEMORYTABLE EXCEEDED
  2069.     BLO.S    .3
  2070.     cmp.l    d2,d3
  2071.     blo    .5
  2072.     move.l    d3,d2
  2073. .5
  2074.     CMP.L    #$2000,D2
  2075.     BLO.S    .6
  2076.     SUB.L    #$1000,D2
  2077. .6    MOVE.L    D2,D0
  2078.     rts
  2079.  
  2080. ALLOCA:
  2081.     tst.l    OSM_EXPMEM
  2082.     beq.b    .ALLOCA_CHIP    ; no expansion: alloc chipmem
  2083.     cmp.l    OSM_EXPMEM,A1
  2084.     bcc.b    .ALLOCA_FAST    ; above expansion: fast memory
  2085. .ALLOCA_CHIP:
  2086.     movem.l    A4,-(A7)
  2087.     LEA.L    ALLOCMTAB,A4    ; chipmem alloc table
  2088.     bsr    GenericAllocAbs
  2089.     movem.l    (A7)+,A4
  2090.     move.l    D0,A1
  2091.     rts
  2092.  
  2093. .ALLOCA_FAST:
  2094.     movem.l    A4,-(A7)
  2095.     move.l    OSM_EXPMEM,A4        ; fastmem alloc table
  2096.     sub.l    A4,A1            ; substracts expbase from the address
  2097.     bsr    GenericAllocAbs        ; the routine returns only offset
  2098.     add.l    A4,D0            ; relative to memory block so we have to add expbase
  2099.     move.l    D0,A1            ; A1=D0 for Harry!
  2100.     movem.l    (A7)+,A4
  2101.     rts
  2102.  
  2103. ; < A4: allocmtab (added by JOTD to be used by fastmem and chipmem)
  2104.  
  2105.  
  2106. GenericAllocAbs
  2107.     MOVEM.L    D2/D3/A2/A3,-(A7)
  2108.     MOVE.L    A7,A3
  2109.     MOVE.L    _Slave(PC),A2
  2110.     MOVE.L    A1,D2
  2111.     ADD.L    D0,D2
  2112.     CMP.L    A2,D2
  2113.     BHS.W    .ERR
  2114.  
  2115.     move.l    A1,D1
  2116.  
  2117. ;    ADDQ.L    #7,D1
  2118.     AND.L    #$FFFFFFF8,D1
  2119.     AND.L    #$FFFFFFF8,D0
  2120.     BEQ.W    .QU
  2121.     MOVEM.L    D0/D1,-(A7)
  2122.  
  2123.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  2124.  
  2125.                     ;CHECK MEM NOT ON A $40-BOUNDARY
  2126.                     ;EVAL BEGINBYTE
  2127.     MOVE.L    D1,D2
  2128.     LSR.L    #6,D2
  2129.     move.L    A4,A0
  2130.     LEA.L    (A0,D2.L),A0
  2131.     MOVEM.L    D1,-(A7)
  2132.     AND.L    #$3F,D1
  2133.     BEQ.S    .CNTCHK
  2134.     LSR.L    #3,D1
  2135. .2    BTST    D1,(A0)
  2136.     BEQ.W    .ERR
  2137.     ADDQ.L    #1,D1
  2138. ;    ADDQ.L    #8,(A7)
  2139.     SUBQ.L    #1,D0
  2140.     BEQ.S    .1
  2141.     CMP.L    #8,D1
  2142.     BEQ.S    .CNTCHK2
  2143.     BRA.S    .2
  2144.  
  2145. .1    MOVEM.L    (A7)+,D1
  2146.     BRA.S    .CONT
  2147.  
  2148. .CNTCHK2
  2149.     ADDQ.L    #1,A0
  2150. .CNTCHK
  2151.     MOVEM.L    (A7)+,D1
  2152.  
  2153.                     ;CLEAR $40-BOUNDARY-BYTES
  2154. .3    CMP.L    #8,D0
  2155.     BLO.S    .CLREND
  2156.  
  2157.     CMP.B    #$FF,(A0)+
  2158.     BNE.S    .ERR
  2159.     SUBQ.L    #8,D0
  2160.     BRA.S    .3
  2161.  
  2162.  
  2163. .CLREND
  2164.     TST.L    D0
  2165.     BEQ.S    .CONT
  2166.     SUBQ.L    #1,D0
  2167.     BTST    D0,(A0)
  2168.     BEQ.S    .ERR
  2169.     BRA.S    .CLREND
  2170.  
  2171. .CONT    MOVEM.L    (A7)+,D0/D1
  2172.  
  2173.                     ;ALLOC MEM
  2174.  
  2175.     LSR.L    #3,D0            ;# OF BITS TO CLEAR IN D0
  2176.  
  2177.                     ;MARK MEM NOT ON A $40-BOUNDARY
  2178.                     ;EVAL BEGINBYTE
  2179.     MOVE.L    D1,D2
  2180.     LSR.L    #6,D2
  2181.     move.l    A4,A0
  2182.     LEA.L    (A0,D2.L),A0
  2183.     MOVEM.L    D1,-(A7)
  2184.     AND.L    #$3F,D1
  2185.     BEQ.S    .CNTMARK
  2186.     LSR.L    #3,D1
  2187. .22    BCLR    D1,(A0)
  2188.     ADDQ.L    #1,D1
  2189. ;    ADDQ.L    #8,(A7)
  2190.     SUBQ.L    #1,D0
  2191.     BEQ.S    .21
  2192.     CMP.L    #8,D1
  2193.     BEQ.S    .CNTMARK2
  2194.     BRA.S    .22
  2195.  
  2196. .21    MOVEM.L    (A7)+,D1
  2197.     BRA.S    .QU
  2198.  
  2199. .CNTMARK2
  2200.     ADDQ.L    #1,A0
  2201. .CNTMARK
  2202.     MOVEM.L    (A7)+,D1
  2203.  
  2204.                     ;CLEAR $40-BOUNDARY-BYTES
  2205. .23    CMP.L    #8,D0
  2206.     BLO.S    .MARKEND
  2207.  
  2208.     SF    (A0)+
  2209.     SUBQ.L    #8,D0
  2210.     BRA.S    .23
  2211.  
  2212.  
  2213. .MARKEND
  2214.     TST.L    D0
  2215.     BEQ.S    .QU
  2216.     SUBQ.L    #1,D0
  2217.     BCLR    D0,(A0)
  2218.     BRA.S    .MARKEND
  2219.  
  2220. .QU
  2221.  
  2222.     MOVE.L    A3,A7
  2223.     MOVEM.L    (A7)+,D2/D3/A2/A3
  2224.     MOVE.L    D1,D0
  2225.     RTS
  2226. .ERR2
  2227. .ERR    MOVE.L    A3,A7
  2228.     MOVEM.L    (A7)+,D2/D3/A2/A3
  2229.     MOVEQ.L    #0,D0
  2230.     RTS
  2231.  
  2232.  
  2233. ****************************************************************************
  2234. * LIST HANDLING IN EXEC                                                    *
  2235. ****************************************************************************
  2236.  
  2237.     ifeq 1
  2238.  
  2239. _Enqueue    ;a0=list a1=node
  2240.     MOVE.B    (LN_PRI,A1),D1
  2241.     MOVE.L    (LN_SUCC,A0),D0
  2242. .1908    MOVE.L    D0,A0
  2243.     MOVE.L    (LN_SUCC,A0),D0
  2244.     BEQ.S     .1914
  2245.     CMP.B     (LN_PRI,A0),D1
  2246.     BLE.S     .1908
  2247. .1914    MOVE.L    (LN_PRED,A0),D0
  2248.     MOVE.L    A1,(LN_PRED,A0)
  2249.     MOVE.L    A0,(LN_SUCC,A1)
  2250.     MOVE.L    D0,(LN_PRED,A1)
  2251.     MOVE.L    D0,A0
  2252.     MOVE.L    A1,(LN_SUCC,A0)
  2253.     RTS
  2254.  
  2255.     endc
  2256.  
  2257. _FINDNAME    ;a0-list, a1-name, returns d0-node
  2258.     MOVEM.L    A2,-(A7)
  2259.     MOVE.L    A0,A2        ;find listheader (lords of war *grr*)
  2260. .HSEARCH
  2261.     TST.L    4(A2)
  2262.     BEQ.S    .HFOUND
  2263.     MOVE.L    4(A2),A2
  2264.     BRA.S    .HSEARCH
  2265.  
  2266. .HFOUND
  2267. .LOOP    TST.L    (A2)
  2268.     BEQ.S    .NOTFOUND
  2269.     MOVE.L    (A2),A2
  2270.     MOVE.L    LN_NAME(A2),A0
  2271.     BSR.W    _strcmp
  2272.     TST.L    D0
  2273.     BEQ.S    .FOUND
  2274.     BRA.S    .LOOP
  2275.  
  2276. .FOUND    MOVE.L    A2,D0
  2277.     MOVEM.L    (A7)+,A2
  2278.     RTS
  2279.  
  2280. .NOTFOUND
  2281.     MOVEQ.L    #0,D0
  2282.     MOVEM.L    (A7)+,A2
  2283.     RTS
  2284.  
  2285.  
  2286. _INSERT        ;a0-list a1-node to be inserted a2-node after which to insert
  2287. .HSEARCH
  2288.     TST.L    4(A0)
  2289.     BEQ.S    .HFOUND
  2290.     MOVE.L    4(A0),A0
  2291.     BRA.S    .HSEARCH
  2292.  
  2293. .HFOUND
  2294.     MOVE.L    A2,-(A7)
  2295.     TST.L    (A7)+
  2296.     BEQ.S    .ADDHEAD
  2297.     CMP.L    A0,A2
  2298.     BEQ.S    .ADDHEAD
  2299.     MOVE.L    LH_TAILPRED(A0),-(A7)
  2300.     CMPM.L    (A7)+,(A2)+    ;IF INSERTING AT END -> .ADDTAIL
  2301.     LEA.L    -4(A2),A2
  2302.     BEQ.S    .ADDTAIL
  2303.     MOVE.L    (A2),A0        ;SUCCESSOR
  2304.     MOVE.L    A1,(LN_PRED,A0)    ;NEW PREDECESSOR
  2305.     MOVE.L    (A2),(A1)    ;SUCCESSOR IN ELEMENT TO BE INSERTED
  2306.     MOVE.L    A2,(LN_PRED,A1)    ;PREDECESSOR IN ELEMENT TO BE INSERTED
  2307.     MOVE.L    A1,(A2)        ;INSERTED NODE IS SUCCESSOR
  2308.     RTS
  2309.  
  2310. .ADDTAIL
  2311.     MOVE.L    (A2),(A1)
  2312.     MOVE.L    A2,LN_PRED(A1)
  2313.     MOVE.L    A1,LH_TAILPRED(A0)
  2314.     MOVE.L    A1,(A2)
  2315.     RTS
  2316.  
  2317. .ADDHEAD
  2318. _ADDHEAD
  2319.     MOVE.L    A2,-(A7)
  2320.     MOVE.L    (A0),A2
  2321.     TST.L    (A2)
  2322.     BEQ.S    .EMPTYLIST
  2323.  
  2324.     MOVE.L    (A0),A2
  2325.     MOVE.L    A2,(A1)
  2326.     MOVE.L    LN_PRED(A2),LN_PRED(A1)
  2327.     MOVE.L    A1,LN_PRED(A2)
  2328.     MOVE.L    A1,(A0)
  2329.     BRA.S    .END
  2330.  
  2331. .EMPTYLIST
  2332.     MOVE.L    (A0),(A1)
  2333.     MOVE.L    LH_TAILPRED(A0),LN_PRED(A1)
  2334.     MOVE.L    A1,(A0)            ;INSERT ELEMENT AS FIRST INTO *LIST
  2335.     MOVE.L    A1,LH_TAILPRED(A0)    ;ELEMENT IS ALSO LAST ONE
  2336. .END    MOVE.L    (A7)+,A2
  2337.     RTS
  2338.  
  2339. _ADDTAIL
  2340.     MOVE.L    A2,-(A7)
  2341.     MOVE.L    (A0),A2
  2342.     TST.L    (A2)
  2343.     BEQ.S    .EMPTYLIST
  2344.     MOVE.L    LH_TAILPRED(A0),A2
  2345.  
  2346.     MOVE.L    (A2),(A1)
  2347.     MOVE.L    A2,LN_PRED(A1)
  2348.     MOVE.L    A1,LH_TAILPRED(A0)
  2349.     MOVE.L    A1,(A2)
  2350.     BRA.S    .END
  2351.  
  2352. .EMPTYLIST
  2353.     MOVE.L    (A0),(A1)
  2354.     MOVE.L    LH_TAILPRED(A0),LN_PRED(A1)
  2355.     MOVE.L    A1,(A0)            ;INSERT ELEMENT AS FIRST INTO *LIST
  2356.     MOVE.L    A1,LH_TAILPRED(A0)
  2357. .END    MOVE.L    (A7)+,A2
  2358.     RTS
  2359.  
  2360. _REMOVE        ;A1-NODE TO REMOVE
  2361.     MOVEM.L    A2,-(A7)
  2362.     MOVE.L    A1,A2
  2363. .HSEARCH
  2364.     TST.L    4(A2)
  2365.     BEQ.S    .HFOUND
  2366.     MOVE.L    4(A2),A2
  2367.     BRA.S    .HSEARCH
  2368.  
  2369. .HFOUND
  2370.     MOVE.L    (A1),A0
  2371.     TST.L    (A0)
  2372.     BEQ.S    .REMTAIL
  2373.     CMP.L    (A2),A1
  2374.     BEQ.S    .REMHEAD
  2375.  
  2376.     MOVE.L    LN_PRED(A1),A0
  2377.     MOVE.L    (A1),(A0)
  2378.     MOVE.L    (A1),A0
  2379.     MOVE.L    LN_PRED(A1),LN_PRED(A0)
  2380. .END    MOVEM.L    (A7)+,A2
  2381.     RTS
  2382.  
  2383. .REMHEAD
  2384.     MOVE.L    A2,A0
  2385.     BSR.S    _REMHEAD
  2386.     BRA.S    .END
  2387.  
  2388. .REMTAIL
  2389.     MOVE.L    A2,A0
  2390.     BSR.S    _REMTAIL
  2391.     BRA.S    .END
  2392.  
  2393. _REMHEAD
  2394.     MOVE.L    (A0),A1
  2395.     TST.L    (A1)
  2396.     BEQ.S    .EMPTYLIST
  2397.     MOVE.L    A2,-(A7)
  2398.     MOVE.L    (A0),A2
  2399.     MOVE.L    A2,D0
  2400.     MOVE.L    (A2),-(A7)
  2401.     TST.L    (A7)+
  2402.     BEQ.S    .SINGLEELEMENT
  2403.     MOVE.L    LN_PRED(A2),D1
  2404.     MOVE.L    (A2),A2
  2405.     MOVE.L    D1,LN_PRED(A2)
  2406.     MOVE.L    A2,(A0)
  2407.     MOVE.L    (A7)+,A2
  2408.     RTS
  2409.  
  2410. .SINGLEELEMENT
  2411.     MOVE.L    (A0),A2
  2412.     MOVE.L    (A2),(A0)
  2413.     MOVE.L    LN_PRED(A2),LH_TAILPRED(A0)
  2414.     MOVE.L    (A7)+,A2
  2415.     RTS
  2416.  
  2417. .EMPTYLIST
  2418.     MOVEQ.L    #0,D0
  2419.     RTS
  2420.  
  2421. _REMTAIL
  2422.     MOVE.L    (A0),A1
  2423.     TST.L    (A1)
  2424.     BEQ.S    .EMPTYLIST
  2425.     MOVE.L    A2,-(A7)
  2426.     MOVE.L    LH_TAILPRED(A0),A2
  2427.     MOVE.L    (A2),-(A7)
  2428.     TST.L    (A7)+
  2429.     BEQ.S    .SINGLEELEMENT
  2430.     MOVE.L    A2,D0
  2431.     MOVE.L    (A2),D1
  2432.     MOVE.L    LN_PRED(A2),A2
  2433.     MOVE.L    D1,(A2)
  2434.     MOVE.L    A2,LH_TAILPRED(A0)
  2435.     MOVE.L    (A7)+,A2
  2436.     RTS
  2437.  
  2438. .SINGLEELEMENT
  2439.     MOVE.L    A2,D0
  2440.     MOVE.L    (A2),(A0)
  2441.     MOVE.L    LN_PRED(A2),LH_TAILPRED(A0)
  2442.     MOVE.L    (A7)+,A2
  2443.     RTS
  2444.  
  2445. .EMPTYLIST
  2446.     MOVEQ.L    #0,D0
  2447.     RTS
  2448.  
  2449. ****************************************************************************
  2450. * INTERRUPTPART IN EXEC                                                    *
  2451. ****************************************************************************
  2452.  
  2453. INT_68        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2454.         move.w    (_custom+intreqr),d0
  2455.         and.w    #INTF_PORTS,d0
  2456.         beq    .ports_end
  2457.  
  2458.     ;call handler/server
  2459. .ports        PEA    .ports_cont(PC)
  2460.         move.l    (4).W,a1
  2461.         MOVE.L    (IVPORTS+IV_CODE,A1),-(A7)
  2462.         move.l    (IVPORTS+IV_DATA,a1),a1
  2463.         RTS
  2464. .ports_cont
  2465. .ports_end
  2466.         move.w    #INTF_PORTS,(_custom+intreq)
  2467.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2468.         rte
  2469.  
  2470. INTSERVNODE_CIAA
  2471.         dc.l    0        ;LN_SUCC
  2472.         dc.l    0        ;LN_PRED
  2473.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2474.         dc.b    120        ;LN_PRI
  2475.         dc.l    _ciaaname    ;LN_NAME
  2476.         dc.l    0        ;IS_DATA
  2477.         dc.l    INT_CIAA    ;IS_CODE
  2478.  
  2479. ;---------------
  2480.  
  2481. INT_6c        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2482.         move.w    (_custom+intreqr),d0
  2483.         and.w    #INTF_COPER!INTF_VERTB,d0
  2484.         AND.W    (_custom+intenar),d0
  2485.         beq    .vertb_end
  2486.         btst    #INTB_COPER,d0
  2487.         bne.s    .vertb_copper
  2488.  
  2489. .vertb
  2490.     ;timer++
  2491.  
  2492.     add.l    #20,millisec_timer
  2493.     cmp.l    #1000,millisec_timer
  2494.     bcs    .skip
  2495.  
  2496.     addq.l    #1,sec_timer
  2497.     clr.l    millisec_timer
  2498. .skip
  2499.     ;set copperlist (this should be the first !)
  2500.         move.l    _gfxbase(PC),a0
  2501.         move.l    (gb_LOFlist,a0),(_custom+cop2lc)
  2502.  ifeq 1
  2503.     ;set sprites
  2504.         tst.b    (gb_SpriteReserved,a0)
  2505.         beq    .ns
  2506.         lea    (_sprites),a0
  2507.         lea    (_custom+sprpt),a1
  2508.         moveq    #7,d0
  2509. .ss        move.l    (a0)+,(a1)+
  2510.         dbf    d0,.ss
  2511. .ns
  2512.  endc
  2513.     ;call handler/server
  2514.         PEA    .vertb_cont(PC)
  2515.         move.l    (4).W,a1
  2516.         MOVE.L    (IVVERTB+IV_CODE,A1),-(A7)
  2517.         move.l    (IVVERTB+IV_DATA,a1),a1
  2518.         RTS
  2519. .vertb_cont
  2520.     ;input handler
  2521.         move.l    _inputhandler(PC),d0
  2522.         beq    .vertb_end
  2523.         moveq    #$6c,d0
  2524.         bsr    _InputHandlerVBI
  2525. .vertb_end
  2526.         move.w    #INTF_BLIT!INTF_VERTB,(_custom+intreq)
  2527.  
  2528. .vertb_vend
  2529.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2530.         rte
  2531. .vertb_copper
  2532.     ;call copperhandler/server
  2533.         PEA    .vertb_cend(PC)
  2534.         move.l    (4).W,a1
  2535.         MOVE.L    (IVCOPER+IV_CODE,A1),-(A7)
  2536.         move.l    (IVCOPER+IV_DATA,a1),a1
  2537.         RTS
  2538.  
  2539. .vertb_cend
  2540.         move.w    #INTF_COPER,(_custom+intreq)
  2541.         bra.s    .vertb_vend
  2542.  
  2543. ;---------------
  2544.  
  2545. INT_70        movem.l    d0-d1/D6/a0-a1/a5-a6,-(a7)
  2546.         move.w    (_custom+intreqr),d6
  2547.         AND.W    (_custom+intenar),d6
  2548.         and.w    #INTF_AUD0!INTF_AUD1!INTF_AUD2!INTF_AUD3,d6
  2549.         BTST    #7,D6
  2550.         BEQ.S    .AUD1
  2551.  
  2552.     ;call handler/server
  2553.         move.l    #$80,d1
  2554.         PEA    .aud0_cont(PC)
  2555.         move.l    (4).W,a1
  2556.         MOVE.L    (IVAUD0+IV_CODE,A1),-(A7)
  2557.         move.l    (IVAUD0+IV_DATA,a1),a1
  2558.         RTS
  2559.  
  2560. .aud0_cont    move.w    #INTF_AUD0,(_custom+intreq)
  2561.         BCLR    #7,D6
  2562.  
  2563. .AUD1        BTST    #8,D6
  2564.         BEQ.S    .AUD2
  2565.  
  2566.     ;call handler/server
  2567.         move.l    #$100,d1
  2568.         PEA    .aud1_cont(PC)
  2569.         move.l    (4).W,a1
  2570.         MOVE.L    (IVAUD1+IV_CODE,A1),-(A7)
  2571.         move.l    (IVAUD1+IV_DATA,a1),a1
  2572.         RTS
  2573.  
  2574. .aud1_cont    MOVE.W    #INTF_AUD1,(_custom+intreq)
  2575.         BCLR    #8,D6
  2576.  
  2577. .AUD2        BTST    #9,D6
  2578.         BEQ.S    .AUD3
  2579.  
  2580.     ;call handler/server
  2581.         move.l    #$200,d1
  2582.         PEA    .aud2_cont(PC)
  2583.         move.l    (4).W,a1
  2584.         MOVE.L    (IVAUD2+IV_CODE,A1),-(A7)
  2585.         move.l    (IVAUD2+IV_DATA,a1),a1
  2586.         RTS
  2587.  
  2588. .aud2_cont    MOVE.W    #INTF_AUD2,(_custom+intreq)
  2589.         BCLR    #9,D6
  2590.  
  2591. .AUD3        BTST    #$A,D6
  2592.         BEQ.S    .aud_end
  2593.  
  2594.     ;call handler/server
  2595.         move.l    #$400,d1
  2596.         PEA    .aud3_cont(PC)
  2597.         move.l    (4).W,a1
  2598.         MOVE.L    (IVAUD3+IV_CODE,A1),-(A7)
  2599.         move.l    (IVAUD3+IV_DATA,a1),a1
  2600.         RTS
  2601.  
  2602. .aud3_cont    MOVE.W    #INTF_AUD3,(_custom+intreq)
  2603.         BCLR    #$A,D6
  2604.  
  2605. .aud_end    movem.l    (a7)+,d0-d1/D6/a0-a1/a5-a6
  2606.         rte
  2607.  
  2608. INTSERVNODE_AUDIO0
  2609.         dc.l    0        ;LN_SUCC
  2610.         dc.l    0        ;LN_PRED
  2611.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2612.         dc.b    120        ;LN_PRI
  2613.         dc.l    0        ;LN_NAME
  2614.         dc.l    0        ;IS_DATA
  2615.         dc.l    _AUD0_CODE    ;IS_CODE
  2616.  
  2617. INTSERVNODE_AUDIO1
  2618.         dc.l    0        ;LN_SUCC
  2619.         dc.l    0        ;LN_PRED
  2620.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2621.         dc.b    120        ;LN_PRI
  2622.         dc.l    0        ;LN_NAME
  2623.         dc.l    0        ;IS_DATA
  2624.         dc.l    _AUD1_CODE    ;IS_CODE
  2625.  
  2626. INTSERVNODE_AUDIO2
  2627.         dc.l    0        ;LN_SUCC
  2628.         dc.l    0        ;LN_PRED
  2629.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2630.         dc.b    120        ;LN_PRI
  2631.         dc.l    0        ;LN_NAME
  2632.         dc.l    0        ;IS_DATA
  2633.         dc.l    _AUD2_CODE    ;IS_CODE
  2634.  
  2635. INTSERVNODE_AUDIO3
  2636.         dc.l    0        ;LN_SUCC
  2637.         dc.l    0        ;LN_PRED
  2638.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2639.         dc.b    120        ;LN_PRI
  2640.         dc.l    0        ;LN_NAME
  2641.         dc.l    0        ;IS_DATA
  2642.         dc.l    _AUD3_CODE    ;IS_CODE
  2643.  
  2644. _AUD0_CODE
  2645. _AUD1_CODE
  2646. _AUD2_CODE
  2647. _AUD3_CODE
  2648.         RTS
  2649.  
  2650.  
  2651. ;---------------
  2652.  
  2653. INT_78        movem.l    d0-d1/a0-a1/a5-a6,-(a7)
  2654.         move.w    (_custom+intreqr),d0
  2655.         and.w    #INTF_EXTER,d0
  2656.         beq    .exter_end
  2657.  
  2658.     ;call handler/server
  2659. .exter        PEA    .exter_cont(PC)
  2660.         move.l    (4).W,a1
  2661.         MOVE.L    (IVEXTER+IV_CODE,A1),-(A7)
  2662.         move.l    (IVEXTER+IV_DATA,a1),a1
  2663.         RTS
  2664. .exter_cont
  2665. .exter_end
  2666.         move.w    #INTF_EXTER,(_custom+intreq)
  2667.         movem.l    (a7)+,d0-d1/a0-a1/a5-a6
  2668.         rte
  2669.  
  2670. INTSERVNODE_CIAB
  2671.         dc.l    0        ;LN_SUCC
  2672.         dc.l    0        ;LN_PRED
  2673.         dc.b    NT_INTERRUPT    ;LN_TYPE
  2674.         dc.b    120        ;LN_PRI
  2675.         dc.l    _ciabname    ;LN_NAME
  2676.         dc.l    0        ;IS_DATA
  2677.         dc.l    INT_CIAB    ;IS_CODE
  2678.  
  2679. ;---------------
  2680.  
  2681. INT_SERVER
  2682.         move.l    (IV_NODE,a1),-(a7)
  2683. .loop        move.l    (a7),d0
  2684.         beq    .end
  2685.         move.l    d0,a0
  2686.         move.l    (LN_SUCC,a0),(a7)
  2687.         move.l    (IS_DATA,a0),a1
  2688.         TST.L    (IS_CODE,A0)
  2689.         BEQ.S    .loop
  2690.         move.l    (IS_CODE,a0),a6
  2691.         pea    (.loop)
  2692.         lea    (_custom),a0    ;some require this
  2693.         jmp    (a6)
  2694. .end        addq.l    #4,a7
  2695.         rts
  2696.  
  2697. ;---------------
  2698.  
  2699. _SETINTVECTOR    ;D0-INT#, A1-INTERRUPTNODE, RET D0-OLD INTERRUPTNODE
  2700.         CMP.L    #$7,D0
  2701.         BLO.S    .NOTSUPPORTED
  2702.         CMP.L    #$B,D0
  2703.         BHS.S    .NOTSUPPORTED
  2704.         MULU    #$C,D0
  2705.         MOVE.L    4.W,A0
  2706.         LEA.L    IntVects(A0,D0.L),A0
  2707.         MOVE.L    IV_NODE(A0),D0
  2708.         MOVE.L    A1,IV_NODE(A0)
  2709.         RTS
  2710.  
  2711. .NOTSUPPORTED    pea    _LVOSetIntVector
  2712.         pea    _execname
  2713.         bra    _emufail
  2714.  
  2715.  
  2716. _AddIntServer    ;d0=intnumber a1=interrupt
  2717.  
  2718.         movem.l    a2-a4,-(a7)
  2719.         mulu    #IV_SIZE,D0
  2720.         lea    (IntVects+IV_NODE,a6,d0.l),a2    ;a2 = list base
  2721.         move.w    #INTF_INTEN,(_custom+intena)
  2722.  
  2723.         move.b    (LN_PRI,a1),d1            ;d1 = priority
  2724.         sub.l    a3,a3                ;a3 = predecessor
  2725.         move.l    (a2),a4                ;a4 = successor
  2726.  
  2727. .next        move.l    a4,d0
  2728.         beq    .hangin
  2729.         cmp.b    (LN_PRI,a4),d1
  2730.         bgt    .hangin
  2731.         move.l    a4,a3
  2732.         move.l    (LN_SUCC,a3),a4
  2733.         bra    .next
  2734.  
  2735. .hangin        move.l    a3,(LN_PRED,a1)
  2736.         bne    .hi1
  2737.         move.l    a2,a3                ;LN_SUCC == 0 !...
  2738. .hi1        move.l    a1,(LN_SUCC,a3)
  2739.         move.l    a4,(LN_SUCC,a1)
  2740.         beq    .hi2
  2741.         move.l    a1,(LN_PRED,a4)
  2742. .hi2
  2743. .end        move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2744.         movem.l    (a7)+,a2-a4
  2745.         rts
  2746.  
  2747.  ifeq 1
  2748.     MOVE.L    D2,-(A7)
  2749.     MOVE.L    D0,D2
  2750.     MOVE.L    D0,D1
  2751.     MULU.W    #IV_SIZE,D0
  2752.     LEA       (IntVects,A6,D0.W),A0
  2753.     MOVE.L    (A0),A0
  2754.     MOVE.W    #INTF_INTEN,(_custom+intena)
  2755.     ADDQ.B    #1,(IDNestCnt,A6)
  2756.     BSR.W     _Enqueue
  2757.     MOVE.W    #-$8000,D0
  2758.     BSET      D2,D0
  2759.     MOVE.W    D0,(_custom+intena)
  2760.     SUBQ.B    #1,(IDNestCnt,A6)
  2761.     BGE.S     .1654
  2762.     MOVE.W    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2763. .1654    MOVE.L    (A7)+,D2
  2764.     RTS
  2765.  endc
  2766.  
  2767. _RemIntServer    ;d0=intnumber a1=interrupt
  2768.  
  2769.     ;this is a workaround for Millenium2·2, which does not set D0 correctly
  2770.         cmp.l    #$20,d0
  2771.         blo    .ok
  2772.         moveq    #5,d0
  2773. .ok
  2774.         movem.l    a2-a4,-(a7)
  2775.         mulu    #IV_SIZE,D0
  2776.         lea    (IntVects+IV_NODE,a6,d0.l),a2    ;a2 = list base
  2777.         move.w    #INTF_INTEN,(_custom+intena)
  2778.  
  2779.         sub.l    a3,a3                ;a3 = predecessor
  2780.         move.l    a2,a0
  2781.         
  2782. .next        move.l    (LN_SUCC,a0),a0
  2783.         cmp.l    a0,a1
  2784.         beq    .hangout
  2785.         move.l    a0,a3
  2786.         bra    .next
  2787.  
  2788. .hangout    move.l    (LN_SUCC,a1),a4            ;a4 = successor
  2789.         move.l    a4,d0
  2790.         beq    .ho1
  2791.         move.l    a3,(LN_PRED,a4)
  2792. .ho1        move.l    a3,d0
  2793.         bne    .ho2
  2794.         move.l    a2,a3                ;LN_SUCC == 0 !...
  2795. .ho2        move.l    a4,(LN_SUCC,a3)
  2796.  
  2797. .end        move.w    #INTF_SETCLR!INTF_INTEN,(_custom+intena)
  2798.         movem.l    (a7)+,a2-a4
  2799.         rts
  2800.  
  2801. _ExitIntr    MOVEM.L    (A7)+,D0-D1/A0-A1/A5-A6
  2802.         RTE
  2803.  
  2804. **************************************************************************
  2805. *   LIBRARY FUNCTIONS                                                    *
  2806. **************************************************************************
  2807.  
  2808. OPENLIB:
  2809.         move.l    a2,-(a7)
  2810.  
  2811.         lea    _libtable,a2
  2812. .next        move.l    (a2)+,a0
  2813.         move.l    a0,d0
  2814.         beq    .err
  2815.         bsr    _strcmp
  2816.         beq    .found
  2817.         addq.l    #4,a2
  2818.         bra    .next
  2819.  
  2820. .found        move.l    (a2),a0
  2821.         jsr    (a0)        ;init
  2822.         
  2823.         move.l    (a7)+,a2
  2824.         rts
  2825.  
  2826. .err
  2827.         pea    _LVOOpenLibrary
  2828.         pea    _execname
  2829.         bra    _emufail
  2830.  
  2831. **************************************************************************
  2832. *   DEVICE FUNCTIONS                                                     *
  2833. **************************************************************************
  2834.  
  2835. _OpenDevice    ;a0=name d0=unit a1=ioreq d1=flags
  2836.         moveM.l    D0/A0-a2,-(a7)
  2837.  
  2838.         MOVE.L    A0,A1
  2839.         lea    _devtable,a2
  2840. .next        move.l    (a2)+,a0
  2841.         move.l    a0,d0
  2842.         beq    .err
  2843.         bsr    _strcmp
  2844.         beq    .found
  2845.         addq.l    #4,a2
  2846.         bra    .next
  2847.  
  2848. .err        pea    _LVOOpenDevice
  2849.         pea    _execname
  2850.         bra    _emufail
  2851.  
  2852. .found
  2853.     cmp.l    #"cd.d",(A0)        ; but what with A0 if will odd address (68000)
  2854.         beq    .dontopen    ; added by JOTD
  2855.  
  2856.         MOVE.L    8(A7),A1
  2857.     IFNE    CORRECTDEVICES
  2858.         MOVE.L    (A2),(IO_DEVICE,A1)
  2859.     ELSE
  2860.         move.l    (a0),(IO_DEVICE,a1)
  2861.     ENDC
  2862.         move.l    (A7),(IO_UNIT,a1)
  2863.         move.b    d1,(IO_FLAGS,A1)
  2864.         MOVEM.L    (A7)+,D0/A0-A2
  2865.         moveq    #0,d0
  2866.         move.b    d0,(IO_ERROR,a1)
  2867.         rts
  2868.  
  2869. .dontopen
  2870.         MOVEM.L    (A7)+,D0/A0-A2
  2871.         moveq.l    #-1,D0
  2872.         rts
  2873.  
  2874. _InputHandlerVBI
  2875.     ;check LMB
  2876.         btst    #CIAB_GAMEPORT0,(_ciaa+ciapra)
  2877.         seq    d0
  2878.         cmp.b    (_last_lmb),d0
  2879.         beq    .lmbend
  2880.         move.b    d0,(_last_lmb)
  2881.         lea    _inputevent,a0
  2882.         clr.l    (ie_NextEvent,a0)
  2883.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2884.         clr.b    (ie_SubClass,a0)
  2885.         move.w    #IECODE_LBUTTON,(ie_Code,a0)
  2886.         tst.b    d0
  2887.         bne    .lmb1
  2888.         or.w    #IECODE_UP_PREFIX,(ie_Code,a0)
  2889. .lmb1        moveq    #0,d0
  2890.         move.b    (_last_lmb),d1
  2891.         beq    .lmb2
  2892.         or.w    #IEQUALIFIER_LEFTBUTTON,d0
  2893. .lmb2        move.b    (_last_rmb),d1
  2894.         beq    .lmb3
  2895.         or.w    #IEQUALIFIER_RBUTTON,d0
  2896. .lmb3        move.w    d0,(ie_Qualifier,a0)
  2897.         pea    .lmbend
  2898.         move.l    _inputhandler,a1
  2899.         move.l    (IS_CODE,a1),-(a7)
  2900.         move.l    (IS_DATA,a1),a1
  2901.         rts                    ;a0=InputEvent a1=HandlerData
  2902. .lmbend
  2903.     ;check RMB
  2904.         btst    #POTGOB_DATLY-8,(_custom+potinp)
  2905.         seq    d0
  2906.         cmp.b    (_last_rmb),d0
  2907.         beq    .rmbend
  2908.         move.b    d0,(_last_rmb)
  2909.         lea    _inputevent,a0
  2910.         clr.l    (ie_NextEvent,a0)
  2911.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2912.         clr.b    (ie_SubClass,a0)
  2913.         move.w    #IECODE_RBUTTON,(ie_Code,a0)
  2914.         tst.b    d0
  2915.         bne    .rmb1
  2916.         or.w    #IECODE_UP_PREFIX,(ie_Code,a0)
  2917. .rmb1        moveq    #0,d0
  2918.         move.b    (_last_lmb),d1
  2919.         beq    .rmb2
  2920.         or.w    #IEQUALIFIER_LEFTBUTTON,d0
  2921. .rmb2        move.b    (_last_rmb),d1
  2922.         beq    .rmb3
  2923.         or.w    #IEQUALIFIER_RBUTTON,d0
  2924. .rmb3        move.w    d0,(ie_Qualifier,a0)
  2925.         pea    .rmbend
  2926.         move.l    _inputhandler,a1
  2927.         move.l    (IS_CODE,a1),-(a7)
  2928.         move.l    (IS_DATA,a1),a1
  2929.         rts                    ;a0=InputEvent a1=HandlerData
  2930. .rmbend
  2931.     ;check MouseMove
  2932.         move.w    (_custom+joy0dat),d0
  2933.         move.w    (_last_joy0dat),d1
  2934.         cmp.w    d0,d1
  2935.         beq    .rts
  2936.         move.w    d0,(_last_joy0dat)
  2937.         lea    _inputevent,a0
  2938.         clr.l    (ie_NextEvent,a0)
  2939.         move.b    #IECLASS_RAWMOUSE,(ie_Class,a0)
  2940.         clr.b    (ie_SubClass,a0)
  2941.         move.w    #IECODE_NOBUTTON,(ie_Code,a0)
  2942.         clr.w    (ie_Qualifier,a0)
  2943.         movem.l    d2-d3,-(a7)
  2944.         moveq    #0,d2
  2945.         move.b    d1,d2
  2946.         moveq    #0,d3
  2947.         move.b    d0,d3
  2948.         sub.w    d2,d3
  2949.         cmp.w    #127,d3
  2950.         bgt    .xsub
  2951.         cmp.w    #-128,d3
  2952.         bge    .xok
  2953.         add.w    #512,d3
  2954. .xsub        sub.w    #256,d3
  2955. .xok        move.w    d3,(ie_X,a0)
  2956.         movem.l    (a7)+,d2-d3
  2957.         lsr.w    #8,d0
  2958.         lsr.w    #8,d1
  2959.         sub.w    d1,d0
  2960.         cmp.w    #127,d0
  2961.         bgt    .ysub
  2962.         cmp.w    #-128,d0
  2963.         bge    .yok
  2964.         add.w    #512,d0
  2965. .ysub        sub.w    #256,d0
  2966. .yok        move.w    d0,(ie_Y,a0)
  2967.         move.l    _inputhandler,a1
  2968.         move.l    (IS_CODE,a1),-(a7)
  2969.         move.l    (IS_DATA,a1),a1
  2970. .rts        rts                    ;a0=InputEvent a1=HandlerData
  2971.  
  2972. _InputHandlerPI    lea    _inputevent,a0
  2973.         clr.l    (ie_NextEvent,a0)
  2974.         move.b    #IECLASS_RAWKEY,(ie_Class,a0)
  2975.         clr.b    (ie_SubClass,a0)
  2976.         moveq    #0,d0
  2977.         move.b    (KBDVAL),d0
  2978.         move.w    d0,(ie_Code,a0)
  2979.         clr.w    (ie_Qualifier,a0)
  2980.         move.l    _inputhandler,a1
  2981.         move.l    (IS_CODE,a1),-(a7)
  2982.         move.l    (IS_DATA,a1),a1
  2983.         rts                    ;a0=InputEvent a1=HandlerData
  2984.  
  2985. _SendIO
  2986. _DoIO        ;a1=ioreq
  2987.         tst.l    (IO_DEVICE,A1)
  2988.         beq    .cd                ; not found: ignore! (JOTD)
  2989.  
  2990.         move.w    (IO_COMMAND,a1),d0        ;d0=command
  2991.     IFNE    CORRECTDEVICES
  2992.         MOVE.L    _tddevtable+4(PC),D1
  2993.         CMP.L    (IO_DEVICE,A1),D1
  2994.     ELSE
  2995.         cmp.l    #"trac",(IO_DEVICE,a1)
  2996.     ENDC
  2997.         beq    .trackdisk
  2998.     IFNE    CORRECTDEVICES
  2999.         MOVE.L    _inpdevtable+4(PC),D1
  3000.         CMP.L    (IO_DEVICE,A1),D1
  3001.     ELSE
  3002.         cmp.l    #"inpu",(IO_DEVICE,a1)
  3003.     ENDC
  3004.         beq    .input
  3005.  
  3006.     ; cd.device added by Jeff
  3007.  
  3008.     IFNE    CORRECTDEVICES
  3009.         MOVE.L    _cddevtable+4(PC),D1
  3010.         CMP.L    (IO_DEVICE,A1),D1
  3011.     ELSE
  3012.         cmp.l    #"cd.d",(IO_DEVICE,a1)
  3013.     ENDC
  3014.         beq    .cd
  3015.  
  3016.     ; cdtv.device added by Jeff
  3017.  
  3018.     IFNE    CORRECTDEVICES
  3019.         MOVE.L    _cdtvdevtable+4(PC),D1
  3020.         CMP.L    (IO_DEVICE,A1),D1
  3021.     ELSE
  3022.         cmp.l    #"cdtv",(IO_DEVICE,a1)
  3023.     ENDC
  3024.         beq    .cd
  3025.  
  3026.     ; keyboard.device added by Jeff
  3027.  
  3028.     IFNE    CORRECTDEVICES
  3029.         MOVE.L    _kbdevtable+4(PC),D1
  3030.         CMP.L    (IO_DEVICE,A1),D1
  3031.     ELSE
  3032.         cmp.l    #"keyb",(IO_DEVICE,a1)
  3033.     ENDC
  3034.         beq    .keyboard
  3035.  
  3036. .fail
  3037.     move.l    D0,D6
  3038.  
  3039.         pea    _LVODoIO
  3040.         pea    _execname
  3041.         bra    _emufail
  3042.         
  3043. .cd
  3044.         moveq.l    #0,D0    ; cd.device,cdtv.device: do nothing
  3045.         rts
  3046.  
  3047. .keyboard
  3048.         cmp.w    #KBD_READMATRIX,d0
  3049.         beq    .kb_readmatrix
  3050.         cmp.w    #KBD_READEVENT,d0
  3051.  
  3052.         cmp.w    #CMD_CLEAR,d0
  3053.  
  3054.         BRA    .fail
  3055. .kb_readmatrix
  3056.         move.l    a1,-(SP)
  3057.         moveq    #15,d0
  3058.         move.l    (IO_LENGTH,a1),d1
  3059.         move.l    (IO_DATA,a1),a0
  3060.         cmp.l    d0,d1
  3061.         bls.s    .lower
  3062.         move.w    d0,d1
  3063. .lower
  3064.         move.l    d1,(IO_ACTUAL,a1)
  3065.         move.l    (IO_DEVICE,a1),a1
  3066.         lea    $136(a1),a1
  3067.         bra.s    .goto
  3068. .loop
  3069.         move.b    (a1)+,(a0)+
  3070. .goto
  3071.         dbra    d1,.loop
  3072.         movea.l    (SP)+,a1
  3073.  
  3074.         clr.b    (IO_ERROR,a1)
  3075.         moveq.l    #0,d0
  3076.         rts
  3077.  
  3078. .input        cmp.w    #CMD_RESET,d0
  3079.         beq    .ret
  3080.         cmp.w    #IND_ADDHANDLER,d0
  3081.         beq    .i_addh
  3082.         cmp.w    #IND_REMHANDLER,d0
  3083.         beq    .i_remh
  3084.         cmp.w    #IND_SETMPORT,d0
  3085.         beq    .ret
  3086.         cmp.w    #IND_SETMTRIG,d0
  3087.         beq    .i_setmtrig
  3088.         BRA    .fail
  3089.  
  3090. .i_addh        move.w    (_custom+joy0dat),(_last_joy0dat)
  3091.         TST.L    _inputhandler
  3092.         BNE    .fail
  3093.         move.l    (IO_DATA,a1),_inputhandler
  3094.         moveq.l    #0,D0            ; added by JOTD
  3095.         rts
  3096. .i_remh        clr.l    _inputhandler
  3097.         rts
  3098. .i_setmtrig    move.l    (IO_DATA,a1),.gpt
  3099.         moveq.l    #0,D0            ; added by JOTD
  3100.         rts
  3101. .gpt        dc.l    0
  3102.  
  3103. .trackdisk    cmp.w    #CMD_READ,d0
  3104.         beq    .td_read
  3105.         cmp.w    #CMD_CLEAR,d0
  3106.         beq    .ret
  3107.         cmp.w    #TD_MOTOR,d0
  3108.         beq    .ret
  3109.         cmp.w    #TD_FORMAT,d0
  3110.         beq    .td_write
  3111.         cmp.w    #TD_REMOVE,d0
  3112.         beq    .ret
  3113.         cmp.w    #TD_CHANGENUM,d0
  3114.         beq    .ret
  3115.         cmp.w    #TD_CHANGESTATE,d0
  3116.         beq    .ret
  3117.         cmp.w    #ETD_SEEK,d0
  3118.         beq    .td_seek    ; added by JOTD
  3119.         cmp.w    #TD_SEEK,d0
  3120.         beq    .td_seek    ; added by JOTD
  3121.         cmp.w    #ETD_READ,d0
  3122.         beq    .td_read
  3123.         cmp.w    #ETD_WRITE,d0
  3124.         beq    .td_write
  3125.         cmp.w    #CMD_WRITE,d0
  3126.         beq    .td_write    ; added by JOTD
  3127.         cmp.w    #ETD_UPDATE,d0
  3128.         beq    .ret
  3129.         cmp.w    #ETD_CLEAR,d0
  3130.         beq    .ret
  3131.         cmp.w    #ETD_MOTOR,d0
  3132.         beq    .ret
  3133.         cmp.w    #CMD_UPDATE,d0    ; added by JOTD
  3134.         beq    .ret
  3135.         BRA.W    .fail
  3136.  
  3137. .td_seek:    ; seek only moves the heads, nothing is read!
  3138.         beq    .ret
  3139.  
  3140.     ;"deuteros" expects that a1 is unchanged !
  3141. .td_read    movem.l    d2/a1,-(a7)
  3142.         move.l    (IO_OFFSET,a1),d0
  3143.         move.l    (IO_LENGTH,a1),d1
  3144.         move.l    d1,(IO_ACTUAL,a1)    ; Mr.Larmer
  3145.         move.l    (IO_UNIT,a1),d2
  3146.         addq.l    #1,d2
  3147.         move.l    (IO_DATA,a1),a0
  3148.         move.l    (_RESLOAD),a1
  3149.         jsr    (resload_DiskLoad,a1)
  3150.         movem.l    (a7)+,d2/a1
  3151. .ret        clr.b    (IO_ERROR,a1)
  3152.         moveq.l    #0,D0            ; added by JOTD
  3153.         rts
  3154.  
  3155. .td_write    tst.l    _p3    ; JOTD: what's this ???
  3156.         bne.b    .td_dowrite
  3157.         move.l    OSM_JSTFLAGS,D0
  3158.         btst    #AFB_NOOSSWAP,D0    ; JST's NOOSSWAP set
  3159.         bne.b    .f            ; don't write!
  3160. .td_dowrite
  3161.         movem.l    a1-a2,-(a7)
  3162.         clr.b    (IO_ERROR,a1)
  3163.         move.l    (IO_LENGTH,a1),d0    ;size
  3164.         lea    (.disk),a0
  3165.         move.l    (IO_UNIT,a1),d1
  3166.         add.b    #"1",d1
  3167.         move.b    d1,(5,a0)        ;name
  3168.         move.l    (IO_OFFSET,a1),d1    ;offset
  3169.         move.l    (IO_DATA,a1),a1        ;address
  3170.         move.l    (_RESLOAD),a2
  3171.         jsr    (resload_SaveFileOffset,a2)
  3172.         movem.l    (a7)+,a1-a2
  3173.         rts
  3174. .f        st    (IO_ERROR,a1)
  3175.         rts
  3176.  
  3177. .disk        dc.b    "Disk.",0,0,0
  3178.  
  3179. _SENDAUDIO
  3180.         CLR.B    IO_ERROR(A1)
  3181.         MOVEQ.L    #0,D0
  3182.         RTS
  3183.  
  3184. _WAITIO
  3185.     IFNE    CORRECTDEVICES
  3186.         MOVE.L    _cddevtable+4(PC),D1
  3187.         CMP.L    (IO_DEVICE,A1),D1
  3188.     ELSE
  3189.         cmp.l    #"cd.d",(IO_DEVICE,a1)
  3190.     ENDC
  3191.         beq    .cd
  3192.  
  3193.     IFNE    CORRECTDEVICES
  3194.         MOVE.L    _cdtvdevtable+4(PC),D1
  3195.         CMP.L    (IO_DEVICE,A1),D1
  3196.     ELSE
  3197.         cmp.l    #"cdtv",(IO_DEVICE,a1)
  3198.     ENDC
  3199.         beq    .cd
  3200.  
  3201. .fail        pea    _LVOWaitIO
  3202.         pea    _execname
  3203.         bra    _emufail
  3204.         
  3205. .cd
  3206.         CLR.B    IO_ERROR(A1)
  3207.         moveq.l    #0,D0    ; cd.device,cdtv.device: do nothing
  3208.         RTS
  3209.  
  3210. _ABORTIO
  3211.         CLR.B    IO_ERROR(A1)
  3212.         MOVEQ.L    #0,D0
  3213.         RTS
  3214.  
  3215. _CHECKIO
  3216.         MOVE.L    A1,D0    ; request has completed
  3217.         RTS
  3218.  
  3219. **************************************************************************
  3220. *   RESOURCE FUNCTIONS                                                   *
  3221. **************************************************************************
  3222.  
  3223. OPENRES        move.l    a2,-(a7)
  3224.  
  3225.         lea    _restable,a2
  3226. .next        move.l    (a2)+,a0
  3227.         move.l    a0,d0
  3228.         beq    .err
  3229.         bsr    _strcmp
  3230.         beq    .found
  3231.         addq.l    #4,a2
  3232.         bra    .next
  3233.  
  3234. .found        move.l    (a2),a0
  3235.         jsr    (a0)        ;init
  3236.         
  3237.         move.l    (a7)+,a2
  3238.         rts
  3239.  
  3240. .err        pea    _LVOOpenResource
  3241.         pea    _execname
  3242.         bra    _emufail
  3243.  
  3244. **************************************************************************
  3245. *   DISK.RESOURCE                                                        *
  3246. **************************************************************************
  3247.  
  3248. DISKINIT    move.l    _diskbase,d0
  3249.         beq    .init
  3250.         rts
  3251.  
  3252. .init
  3253.         move.l    #-_LVOReadUnitID,D0
  3254.         move.l    #5*4,d1
  3255.         lea    _diskname,a0
  3256.         bsr    _InitStruct
  3257.         move.l    d0,_diskbase
  3258.         move.l    d0,a0
  3259.  
  3260.         ; patches
  3261.  
  3262.         patch    _LVOGetUnit(a0),GETUNIT(pc)
  3263.  
  3264.         ; clears interrupt structure
  3265.  
  3266.         clr.l    (a0)+
  3267.         clr.l    (a0)+
  3268.         clr.l    (a0)+
  3269.         clr.l    (a0)+
  3270.         clr.l    (a0)
  3271.  
  3272.  
  3273.         rts
  3274.  
  3275. GETUNIT:
  3276.     moveq.l    #-1,d0        ; not exactly the thing to do but...
  3277.     rts
  3278.  
  3279.  
  3280. **************************************************************************
  3281. *   CIAA.RESOURCE                                                        *
  3282. **************************************************************************
  3283.  
  3284. CIAAINIT    move.l    _ciaabase,d0
  3285.         beq    .init
  3286.         rts
  3287.  
  3288. .init        move.l    #-_LVOSetICR,d0
  3289.         move.l    #5*4,d1
  3290.         lea    _ciaaname(pc),a0
  3291.         bsr    _InitStruct
  3292.         move.l    d0,a0
  3293.         move.l    d0,_ciaabase
  3294.  
  3295.         patch    _LVOAddICRVector(a0),CIAAADDICRV(pc)
  3296.         patch    _LVORemICRVector(a0),CIAAREMICRV(pc)
  3297.  
  3298.         clr.l    (a0)+
  3299.         clr.l    (a0)+
  3300.         clr.l    (a0)+
  3301.         move.l    #INTSERVNODE_SP,(a0)+
  3302.         clr.l    (a0)
  3303.  
  3304.         MOVE.B    #$FF,$BFE701
  3305.  
  3306.         rts
  3307.  
  3308. INTSERVNODE_SP    dc.l    0        ;LN_SUCC
  3309.         dc.l    0        ;LN_PRED
  3310.         dc.b    NT_INTERRUPT    ;LN_TYPE
  3311.         dc.b    0        ;LN_PRI
  3312.         dc.l    0        ;LN_NAME
  3313.         dc.l    0        ;IS_DATA
  3314.         dc.l    INT_KBD        ;IS_CODE
  3315.  
  3316. INT_KBD
  3317.         movem.l    D2-D4/A6,-(SP)
  3318.         movea.l    A1,A6
  3319.         moveq    #0,D2
  3320.         move.b    $BFEC01,D2
  3321.  
  3322.         MOVE.B    #$41,$BFEE01
  3323.  
  3324. ;        ori.b    #$40,$BFEE01
  3325.  
  3326.         MOVEQ.L    #2,D3
  3327. .4        MOVE.L    D1,-(A7)
  3328.         MOVE.B    $DFF006,D1
  3329. .3        CMP.B    $DFF006,D1
  3330.         BEQ.S    .3
  3331.         MOVE.L    (A7)+,D1
  3332.         DBF    D3,.4
  3333.  
  3334.         moveq    #0,D4
  3335.         not.b    D2
  3336.         ror.b    #1,D2
  3337.  
  3338.         MOVE.B    D2,KBDVAL
  3339.  
  3340.         cmpi.b    #$78,D2
  3341.         bne.s    lbC000078
  3342.  
  3343.         illegal
  3344.     ifeq    1
  3345.         bset    #0,$134(A6)
  3346.         beq.s    lbC00007E
  3347.         bset    #1,$134(A6)
  3348.         bne.w    lbC00012E
  3349.         movea.l    $124(A6),A1
  3350.         tst.l    (A1)
  3351.         beq.w    lbC00012C
  3352. lbC00005E
  3353.         move.l    (A1),D3
  3354.         beq.w    lbC00012E
  3355.         addq.w    #1,$132(A6)
  3356.         move.l    A6,-(SP)
  3357.         movea.l    $24(A6),A6
  3358.         jsr    -$B4(A6)
  3359.         movea.l    (SP)+,A6
  3360.         movea.l    D3,A1
  3361.         bra.s    lbC00005E
  3362.     endc
  3363. lbC000078
  3364.         bclr    #0,$134(A6)
  3365. lbC00007E
  3366.         move.w    D2,D1
  3367.         andi.w    #$7F,D1
  3368.         cmpi.w    #$71,D1
  3369.         bhi.w    lbC0000EA
  3370.         move.w    D1,D0
  3371.         andi.w    #7,D0
  3372.         lsr.w    #3,D1
  3373.         lea    $136(A6),A0
  3374.         btst    #7,D2
  3375.         bne.s    lbC0000AE
  3376.         bset    D0,0(A0,D1.W)
  3377.         cmpi.w    #12,D1
  3378.         bne.s    lbC0000CE
  3379.         bset    D0,$135(A6)
  3380.         bra.s    lbC0000CE
  3381. lbC0000AE
  3382.         bclr    D0,0(A0,D1.W)
  3383.         cmpi.w    #12,D1
  3384.         bne.s    lbC0000CE
  3385.         bclr    D0,$135(A6)
  3386.         bra.s    lbC0000CE
  3387. lbW0000BE
  3388.         dc.w    $80,$E0,$E0,$F0,$804,$7C,0,0
  3389. lbC0000CE
  3390.         move.w    D2,D1
  3391.         andi.w    #$7F,D1
  3392.         move.w    D1,D0
  3393.         andi.w    #7,D0
  3394.         lsr.w    #3,D1
  3395.         lea    lbW0000BE(PC),A0
  3396.         btst    D0,0(A0,D1.W)
  3397.         beq.s    lbC0000EA
  3398.         ori.w    #$100,D4
  3399. lbC0000EA
  3400.         move.w    $72(A6),D1
  3401.         move.w    D1,D0
  3402.         addq.w    #4,D0
  3403.         andi.w    #$7F,D0
  3404.         cmp.w    $70(A6),D0
  3405.         bne.s    lbC000108
  3406.         move.w    D1,D0
  3407.         move.w    #$7D,D2
  3408.         subq.w    #4,D1
  3409.         andi.w    #$7F,D1
  3410. lbC000108
  3411.         move.w    D2,$74(A6,D1.W)
  3412.         or.b    $135(A6),D4
  3413.         move.w    D4,$76(A6,D1.W)
  3414.         move.w    D0,$72(A6)
  3415. ;        btst    #0,$3D(A6)
  3416. ;        bne.s    lbC00012C
  3417. ;        movea.l    $48(A6),A1
  3418. ;        tst.l    (A1)
  3419. ;        beq.s    lbC00012C
  3420. ;        bsr.l    *-$FFFF0278
  3421. ;lbC00012C
  3422.  
  3423.         MOVE.B    #$1,$BFEE01
  3424.  
  3425. ;        andi.b    #$BF,$BFEE01
  3426.  
  3427. lbC00012E
  3428.         MOVE.B    KBDVAL,d0
  3429.         TST.L    OSM_SLVTRAINER
  3430.         BEQ.S    .NOTRAINER
  3431.         MOVE.L    OSM_SLVTRAINER(PC),A0
  3432.         JSR    (A0)
  3433. .NOTRAINER
  3434.         MOVE.B    D0,KBDVAL
  3435.         BEQ.S    .1
  3436.         move.l    (_Slave),a0
  3437.         CMP.B    (ws_keyexit,a0),D0
  3438.         BEQ.S    .QUIT
  3439. .1
  3440.         movem.l    (SP)+,D2-D4/A6
  3441.         move.l    _inputhandler(PC),d0
  3442.         bne    _InputHandlerPI
  3443.         rts
  3444.  
  3445. .QUIT        PEA    TDREASON_OK
  3446.         MOVE.L    _RESLOAD(PC),-(A7)
  3447.         add.l    #resload_Abort,(a7)
  3448.         rts
  3449.  
  3450. CIAAADDICRV    move.l    #$80,d1
  3451.         bset    d0,d1
  3452.         move.b    d1,$bfed01
  3453.         bra.s    ADDICRV
  3454.  
  3455. CIABADDICRV
  3456.         move.l    #$80,d1
  3457.         bset    d0,d1
  3458.         move.b    d1,$bfdd00
  3459.  
  3460.  
  3461. ADDICRV        lsl.w    #2,d0
  3462.         move.l    (a6,d0.w),d1
  3463.         bne    .1
  3464.         move.l    a1,(a6,d0.w)
  3465. .1        move.l    d1,d0
  3466.         rts
  3467. CIAAREMICRV    moveq.l    #0,d1
  3468.         bset    d0,d1
  3469.         move.b    d1,$bfed01
  3470.         bra.s    REMICRV
  3471.  
  3472. CIABREMICRV    moveq.l    #0,d1
  3473.         bset    d0,d1
  3474.         move.b    d1,$bfdd00
  3475.  
  3476. REMICRV        lsl.w    #2,d0
  3477.         cmp.l    (a6,d0.w),a1
  3478.         bne    .1
  3479.         clr.l    (a6,d0.w)
  3480. .1        rts
  3481.  
  3482.  
  3483.  
  3484. INT_CIAA    move.l    _ciaabase,a6
  3485.         MOVE.B    $BFED01,D0
  3486. INT_CIA
  3487. .chk        Bclr    #0,D0
  3488.         BNE.S    .ta
  3489.         Bclr    #1,D0
  3490.         BNE.S    .tb
  3491.         Bclr    #2,D0
  3492.         BNE.S    .alarm
  3493.         Bclr    #3,D0
  3494.         BNE.S    .sp
  3495.         Bclr    #4,D0
  3496.         BNE.S    .flag
  3497.         RTS
  3498.  
  3499. .ta        MOVE.L    (A6),A0
  3500.         BRA.S    .IN
  3501. .tb        MOVE.L    (4,A6),A0
  3502.         BRA.S    .IN
  3503. .alarm        MOVE.L    (8,A6),A0
  3504.         BRA.S    .IN
  3505. .sp        MOVE.L    (12,A6),A0
  3506.         BRA.S    .IN
  3507. .flag        MOVE.L    (16,A6),A0
  3508.  
  3509. .IN        move.l    a0,d1
  3510.         beq    .chk
  3511.         MOVE.L    (IS_DATA,A0),A1
  3512.         MOVE.L    (IS_CODE,A0),A0
  3513.         movem.l    d0/a6,-(a7)
  3514.         Jsr    (A0)
  3515.         movem.l    (a7)+,d0/a6
  3516.         bra    .chk
  3517.  
  3518. **************************************************************************
  3519. *   CIAB.RESOURCE                                                        *
  3520. **************************************************************************
  3521.  
  3522. CIABINIT    move.l    _ciabbase,d0
  3523.         beq    .init
  3524.         rts
  3525.  
  3526. .init        move.l    #-_LVOSetICR,d0
  3527.         move.l    #5*4,d1
  3528.         lea    _ciabname(pc),a0
  3529.         bsr    _InitStruct
  3530.         move.l    d0,a0
  3531.         move.l    d0,_ciabbase
  3532.  
  3533.         patch    _LVOAddICRVector(a0),CIABADDICRV(pc)
  3534.         patch    _LVORemICRVector(a0),CIABREMICRV(pc)
  3535.         
  3536.         clr.l    (a0)+
  3537.         clr.l    (a0)+
  3538.         clr.l    (a0)+
  3539.         clr.l    (a0)+
  3540.         clr.l    (a0)
  3541.  
  3542.         MOVE.B    #$FF,$BFD500
  3543.         MOVE.B    #$FF,$BFD700
  3544.  
  3545.         rts
  3546.  
  3547. INT_CIAB    move.l    _ciabbase,a6
  3548.         MOVE.B    $BFDD00,D0
  3549.         bra    INT_CIA
  3550.  
  3551. **************************************************************************
  3552. **************************************************************************
  3553.  
  3554.     INCLUDE    dos.s
  3555.     INCLUDE    freeanim.s
  3556.     INCLUDE    nonvolatile.s
  3557.     INCLUDE    graphics.s
  3558.     INCLUDE    intuition.s
  3559.     INCLUDE    lowlevel.s
  3560.     INCLUDE    mathffp.s
  3561.     INCLUDE    mathtrans.s
  3562.  
  3563. **************************************************************************
  3564. **************************************************************************
  3565. *   CHIPMEMORYTABLE AND MEMORY MANAGEMENT DATA                           *
  3566. **************************************************************************
  3567.  
  3568. ;THIS HAS TO BE ABSOLUTELY THE LAST LABEL, THE TABLE HAS A LEN DEPENDING
  3569. ;  FROM THE SIZE OF THE MEMORY
  3570.     DC.B    'OSEMUEND'
  3571.     CNOP    0,8
  3572. _osemu_end
  3573. ALLOCMTAB
  3574.  
  3575.